|
1363
|
30
|
17
|
2026-04-11T15:42:01.486113+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922121486_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl http://localhost:3030/health | jq .
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-101960863956034134
|
4451267659801064546
|
clipboard
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl http://localhost:3030/health | jq .
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
1362
|
|
1364
|
30
|
18
|
2026-04-11T15:42:05.220917+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922125220_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
810635838678462500
|
3008989881299924582
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
1365
|
30
|
19
|
2026-04-11T15:42:35.343990+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922155343_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
810635838678462500
|
3008989881299924582
|
idle
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
1364
|
|
1371
|
30
|
25
|
2026-04-11T15:43:00.947930+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922180947_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
810635838678462500
|
3008989881299924582
|
click
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
1372
|
30
|
26
|
2026-04-11T15:43:02.851305+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922182851_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ echo "alias spstatus='curl -s http://localhost:3030/health | jq \"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'" >> ~/.zshrc
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias spstatus='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias spstatus='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
8059017237112085187
|
3008989881299924582
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ echo "alias spstatus='curl -s http://localhost:3030/health | jq \"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'" >> ~/.zshrc
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
1371
|
|
1378
|
30
|
32
|
2026-04-11T15:43:23.999667+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922203999_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
810635838678462500
|
3008989881299924582
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
1377
|
|
1384
|
30
|
38
|
2026-04-11T15:44:34.018525+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922274018_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
1954793808959611333
|
4161911385906771558
|
click
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
1383
|
|
1385
|
30
|
39
|
2026-04-11T15:44:40.378165+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922280378_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias spstatus='curl -s http://localhost:3030/health | jq \"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'" >> ~/.zshrc
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias spstatus='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias spstatus='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-6150475841360271668
|
3008989881299924582
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias spstatus='curl -s http://localhost:3030/health | jq \"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'" >> ~/.zshrc
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
1386
|
30
|
40
|
2026-04-11T15:45:13.641781+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922313641_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
2624574563273396137
|
3008989898479777382
|
idle
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
1385
|
|
1387
|
30
|
41
|
2026-04-11T15:45:19.614630+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922319614_m1.jpg...
|
iTerm2
|
nano
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] record --disable-audio &"
alias rmbc="rm -rf bootstrap/cache/*.php"
alias addssh="ssh-add ~/.ssh/*"
alias install_nano="apt-get update & apt-get install nano"
#alias prod_virt="ssh -t -A lukas@jiminny-prod-bastion ssh ubuntu@[IP_ADDRESS]"
#alias stage_virt="ssh -t -A lukas@jiminny-stage-bastion ssh ubuntu@[IP_ADDRESS]"
#alias stgvirt="ssh -t -A lukas@jiminny-stage-bastion ssh ubuntu@"
alias co="git checkout"
alias gs="git status"
alias gcb="git branch --show-current | pbcopy"
alias gbr="git branch --sort=-committerdate"
alias csfix="make cs-fix"
alias cov="./vendor/bin/phpunit tests/Unit --coverage-html=build/coverage"
alias work="cd ~/jiminny/infrastructure/dev/docker && docker compose up"
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n UW PICO 5.09 File: /Users/lukas/.zprofile \n\neval \"$(/opt/homebrew/bin/brew shellenv)\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n\nexport GITHUB_PACKAGES_REGISTRY_READ_PAT=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\nexport FONTAWESOME_NPM_AUTH_TOKEN=3ED3A214-C92A-4C04-880B-9615784E2493\n\nalias ll=\"ls -la --color=tty\"\n\nalias kar=\"cp -f ~/DEV/settings/goku-karabiner-settings/karabiner.edn ~/.config/karabiner.edn && goku\"\nalias app=\"cd ~/jiminny/app\"\nalias ext=\"nvm use 20 && cd ~/jiminny/extension-app && yarn build:dev && yarn preview\"\nalias zp=\"nano ~/.zprofile\"\nalias hhh=\"history\"\nalias hhs=\"history 0 | grep \"\n\nalias sp-stop=\"pkill -f screenpipe && echo 'screenpipe stopped'\"\nalias sp-start=\"npx screenpipe@latest record --disable-audio &\"\n\nalias rmbc=\"rm -rf bootstrap/cache/*.php\"\n\nalias addssh=\"ssh-add ~/.ssh/*\"\n\nalias install_nano=\"apt-get update & apt-get install nano\"\n\n#alias prod_virt=\"ssh -t -A lukas@jiminny-prod-bastion ssh ubuntu@10.30.80.238\"\n#alias stage_virt=\"ssh -t -A lukas@jiminny-stage-bastion ssh ubuntu@10.30.142.112\"\n#alias stgvirt=\"ssh -t -A lukas@jiminny-stage-bastion ssh ubuntu@\"\n\nalias co=\"git checkout\"\nalias gs=\"git status\"\nalias gcb=\"git branch --show-current | pbcopy\"\nalias gbr=\"git branch --sort=-committerdate\"\n\nalias csfix=\"make cs-fix\"\nalias cov=\"./vendor/bin/phpunit tests/Unit --coverage-html=build/coverage\"\n\nalias work=\"cd ~/jiminny/infrastructure/dev/docker && docker compose up\"\n\n\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","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n UW PICO 5.09 File: /Users/lukas/.zprofile \n\neval \"$(/opt/homebrew/bin/brew shellenv)\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n\nexport GITHUB_PACKAGES_REGISTRY_READ_PAT=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\nexport FONTAWESOME_NPM_AUTH_TOKEN=3ED3A214-C92A-4C04-880B-9615784E2493\n\nalias ll=\"ls -la --color=tty\"\n\nalias kar=\"cp -f ~/DEV/settings/goku-karabiner-settings/karabiner.edn ~/.config/karabiner.edn && goku\"\nalias app=\"cd ~/jiminny/app\"\nalias ext=\"nvm use 20 && cd ~/jiminny/extension-app && yarn build:dev && yarn preview\"\nalias zp=\"nano ~/.zprofile\"\nalias hhh=\"history\"\nalias hhs=\"history 0 | grep \"\n\nalias sp-stop=\"pkill -f screenpipe && echo 'screenpipe stopped'\"\nalias sp-start=\"npx screenpipe@latest record --disable-audio &\"\n\nalias rmbc=\"rm -rf bootstrap/cache/*.php\"\n\nalias addssh=\"ssh-add ~/.ssh/*\"\n\nalias install_nano=\"apt-get update & apt-get install nano\"\n\n#alias prod_virt=\"ssh -t -A lukas@jiminny-prod-bastion ssh ubuntu@10.30.80.238\"\n#alias stage_virt=\"ssh -t -A lukas@jiminny-stage-bastion ssh ubuntu@10.30.142.112\"\n#alias stgvirt=\"ssh -t -A lukas@jiminny-stage-bastion ssh ubuntu@\"\n\nalias co=\"git checkout\"\nalias gs=\"git status\"\nalias gcb=\"git branch --show-current | pbcopy\"\nalias gbr=\"git branch --sort=-committerdate\"\n\nalias csfix=\"make cs-fix\"\nalias cov=\"./vendor/bin/phpunit tests/Unit --coverage-html=build/coverage\"\n\nalias work=\"cd ~/jiminny/infrastructure/dev/docker && docker compose up\"\n\n\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","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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":"nano","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"nano","depth":1,"bounds":{"left":0.4875,"top":0.033333335,"width":0.025,"height":0.017777778},"role_description":"text"}]...
|
-8583968705719012387
|
3009130618771494502
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] record --disable-audio &"
alias rmbc="rm -rf bootstrap/cache/*.php"
alias addssh="ssh-add ~/.ssh/*"
alias install_nano="apt-get update & apt-get install nano"
#alias prod_virt="ssh -t -A lukas@jiminny-prod-bastion ssh ubuntu@[IP_ADDRESS]"
#alias stage_virt="ssh -t -A lukas@jiminny-stage-bastion ssh ubuntu@[IP_ADDRESS]"
#alias stgvirt="ssh -t -A lukas@jiminny-stage-bastion ssh ubuntu@"
alias co="git checkout"
alias gs="git status"
alias gcb="git branch --show-current | pbcopy"
alias gbr="git branch --sort=-committerdate"
alias csfix="make cs-fix"
alias cov="./vendor/bin/phpunit tests/Unit --coverage-html=build/coverage"
alias work="cd ~/jiminny/infrastructure/dev/docker && docker compose up"
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
NULL
|
|
1388
|
30
|
42
|
2026-04-11T15:45:31.676559+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922331676_m1.jpg...
|
iTerm2
|
nano
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] -p22"
autoload -U colors && colors
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "
# Load version control information
autoload -Uz vcs_info
precmd() { vcs_info }
# Format the vcs_info_msg_0_ variable
zstyle ':vcs_info:git:*' formats ' (%b)'
# Set up the prompt (with git branch name)
setopt PROMPT_SUBST
PROMPT='%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~%{$reset_color%}% %{$fg[green]%}% ${vcs_info_msg_0_}%{$reset_color%}% $ '
# Setting PATH for Python 3.11
# The original version is saved in .zprofile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}"
export PATH
function cursor {
if [[ $# = 0 ]]; then
open -a "Cursor"
else
local argPath="$1"
[[ $1 = /* ]] && argPath="$1" || argPath="$PWD/${1#./}"
open -a "Cursor" "$argPath"
fi
}
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n UW PICO 5.09 File: /Users/lukas/.zprofile \n\nalias prophetup=\"aws-vault exec staging -- bash -c \\\"env | grep AWS_ > aws-creds.env && docker compose -f docker-compose.yml -f docker-compose.dev.yml up --build\\\"\"\nalias prophetdown=\"aws-vault exec staging -- bash -c \\\"env | grep AWS_ > aws-creds.env && docker compose -f docker-compose.yml -f docker-compose.dev.yml down\\\"\"\nalias poetryshell=\"eval \\\"$(poetry env activate)\\\"\"\n\nalias nas=\"ssh Adm1n@192.168.0.242 -p22\"\n\nautoload -U colors && colors\nPS1=\"%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% \"\n\n# Load version control information\nautoload -Uz vcs_info\nprecmd() { vcs_info }\n\n# Format the vcs_info_msg_0_ variable\nzstyle ':vcs_info:git:*' formats ' (%b)'\n\n# Set up the prompt (with git branch name)\nsetopt PROMPT_SUBST\nPROMPT='%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~%{$reset_color%}% %{$fg[green]%}% ${vcs_info_msg_0_}%{$reset_color%}% $ '\n\n# Setting PATH for Python 3.11\n# The original version is saved in .zprofile.pysave\nPATH=\"/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}\"\nexport PATH\n\nfunction cursor {\n if [[ $# = 0 ]]; then \n open -a \"Cursor\"\n\u0000\u0000\u0000\u0000else\n local argPath=\"$1\"\n [[ $1 = /* ]] && argPath=\"$1\" || argPath=\"$PWD/${1#./}\"\n open -a \"Cursor\" \"$argPath\"\n\u0000\u0000\u0000\u0000fi\n}\n\n\n\n\n\n\n\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","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n UW PICO 5.09 File: /Users/lukas/.zprofile \n\nalias prophetup=\"aws-vault exec staging -- bash -c \\\"env | grep AWS_ > aws-creds.env && docker compose -f docker-compose.yml -f docker-compose.dev.yml up --build\\\"\"\nalias prophetdown=\"aws-vault exec staging -- bash -c \\\"env | grep AWS_ > aws-creds.env && docker compose -f docker-compose.yml -f docker-compose.dev.yml down\\\"\"\nalias poetryshell=\"eval \\\"$(poetry env activate)\\\"\"\n\nalias nas=\"ssh Adm1n@192.168.0.242 -p22\"\n\nautoload -U colors && colors\nPS1=\"%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% \"\n\n# Load version control information\nautoload -Uz vcs_info\nprecmd() { vcs_info }\n\n# Format the vcs_info_msg_0_ variable\nzstyle ':vcs_info:git:*' formats ' (%b)'\n\n# Set up the prompt (with git branch name)\nsetopt PROMPT_SUBST\nPROMPT='%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~%{$reset_color%}% %{$fg[green]%}% ${vcs_info_msg_0_}%{$reset_color%}% $ '\n\n# Setting PATH for Python 3.11\n# The original version is saved in .zprofile.pysave\nPATH=\"/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}\"\nexport PATH\n\nfunction cursor {\n if [[ $# = 0 ]]; then \n open -a \"Cursor\"\n\u0000\u0000\u0000\u0000else\n local argPath=\"$1\"\n [[ $1 = /* ]] && argPath=\"$1\" || argPath=\"$PWD/${1#./}\"\n open -a \"Cursor\" \"$argPath\"\n\u0000\u0000\u0000\u0000fi\n}\n\n\n\n\n\n\n\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","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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":"nano","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"nano","depth":1,"bounds":{"left":0.4875,"top":0.033333335,"width":0.025,"height":0.017777778},"role_description":"text"}]...
|
1153558738826457959
|
2937073162189296738
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] -p22"
autoload -U colors && colors
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "
# Load version control information
autoload -Uz vcs_info
precmd() { vcs_info }
# Format the vcs_info_msg_0_ variable
zstyle ':vcs_info:git:*' formats ' (%b)'
# Set up the prompt (with git branch name)
setopt PROMPT_SUBST
PROMPT='%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~%{$reset_color%}% %{$fg[green]%}% ${vcs_info_msg_0_}%{$reset_color%}% $ '
# Setting PATH for Python 3.11
# The original version is saved in .zprofile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}"
export PATH
function cursor {
if [[ $# = 0 ]]; then
open -a "Cursor"
else
local argPath="$1"
[[ $1 = /* ]] && argPath="$1" || argPath="$PWD/${1#./}"
open -a "Cursor" "$argPath"
fi
}
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
1387
|
|
1389
|
30
|
43
|
2026-04-11T15:45:40.763304+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922340763_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
3024570959584171357
|
3009130618788279906
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
1390
|
30
|
44
|
2026-04-11T15:45:52.873105+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922352873_m1.jpg...
|
iTerm2
|
ls
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ls
Close Tab
ssh
Close Tab
⌥⌘1
ls...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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":"ls","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"ls","depth":1,"bounds":{"left":0.49444443,"top":0.033333335,"width":0.011111111,"height":0.017777778},"role_description":"text"}]...
|
-7308130696015354492
|
2973105120308395616
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ls
Close Tab
ssh
Close Tab
⌥⌘1
ls...
|
1389
|
|
1391
|
30
|
45
|
2026-04-11T15:46:17.063567+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922377063_m1.jpg...
|
iTerm2
|
nano
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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
UW PICO 5.09 File: .zshrc
. ~/.zprofile
source /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop
# Added by Windsurf
export PATH="/Users/lukas/.codeium/windsurf/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
alias sp-status='curl -s http://localhost:3030/health | jq "{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeli$
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 \n UW PICO 5.09 File: .zshrc \n\n. ~/.zprofile\n\nsource /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop\n\n# Added by Windsurf\nexport PATH=\"/Users/lukas/.codeium/windsurf/bin:$PATH\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n[ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" # This loads nvm bash_completion\nalias sp-status='curl -s http://localhost:3030/health | jq \"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeli$\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 \n UW PICO 5.09 File: .zshrc \n\n. ~/.zprofile\n\nsource /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop\n\n# Added by Windsurf\nexport PATH=\"/Users/lukas/.codeium/windsurf/bin:$PATH\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n[ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" # This loads nvm bash_completion\nalias sp-status='curl -s http://localhost:3030/health | jq \"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeli$\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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":"nano","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"nano","depth":1,"bounds":{"left":0.4875,"top":0.033333335,"width":0.025,"height":0.017777778},"role_description":"text"}]...
|
-6692613549932102593
|
2973105120304191074
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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
UW PICO 5.09 File: .zshrc
. ~/.zprofile
source /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop
# Added by Windsurf
export PATH="/Users/lukas/.codeium/windsurf/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
alias sp-status='curl -s http://localhost:3030/health | jq "{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeli$
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
NULL
|
|
1392
|
30
|
46
|
2026-04-11T15:46:35.157384+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922395157_m1.jpg...
|
iTerm2
|
nano
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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
UW PICO 5.09 File: .zshrc
. ~/.zprofile
source /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop
# Added by Windsurf
export PATH="/Users/lukas/.codeium/windsurf/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}"'
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 \n UW PICO 5.09 File: .zshrc \n\n. ~/.zprofile\n\nsource /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop\n\n# Added by Windsurf\nexport PATH=\"/Users/lukas/.codeium/windsurf/bin:$PATH\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n[ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" # This loads nvm bash_completion\n$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 \n UW PICO 5.09 File: .zshrc \n\n. ~/.zprofile\n\nsource /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop\n\n# Added by Windsurf\nexport PATH=\"/Users/lukas/.codeium/windsurf/bin:$PATH\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n[ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" # This loads nvm bash_completion\n$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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":"nano","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"nano","depth":1,"bounds":{"left":0.4875,"top":0.033333335,"width":0.025,"height":0.017777778},"role_description":"text"}]...
|
-1572275844958480503
|
2973105120304191074
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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
UW PICO 5.09 File: .zshrc
. ~/.zprofile
source /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop
# Added by Windsurf
export PATH="/Users/lukas/.codeium/windsurf/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}"'
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
1391
|
|
1393
|
30
|
47
|
2026-04-11T15:46:38.894015+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922398894_m1.jpg...
|
iTerm2
|
nano
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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
UW PICO 5.09 File: .zshrc
. ~/.zprofile
source /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop
# Added by Windsurf
export PATH="/Users/lukas/.codeium/windsurf/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}"'
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 \n UW PICO 5.09 File: .zshrc \n\n. ~/.zprofile\n\nsource /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop\n\n# Added by Windsurf\nexport PATH=\"/Users/lukas/.codeium/windsurf/bin:$PATH\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n[ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" # This loads nvm bash_completion\n$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 \n UW PICO 5.09 File: .zshrc \n\n. ~/.zprofile\n\nsource /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop\n\n# Added by Windsurf\nexport PATH=\"/Users/lukas/.codeium/windsurf/bin:$PATH\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n[ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" # This loads nvm bash_completion\n$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\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","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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":"nano","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"nano","depth":1,"bounds":{"left":0.4875,"top":0.033333335,"width":0.025,"height":0.017777778},"role_description":"text"}]...
|
-2134425604097212861
|
2973105120304191074
|
click
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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
UW PICO 5.09 File: .zshrc
. ~/.zprofile
source /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop
# Added by Windsurf
export PATH="/Users/lukas/.codeium/windsurf/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}"'
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
NULL
|
|
1394
|
30
|
48
|
2026-04-11T15:46:43.816017+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922403816_m1.jpg...
|
iTerm2
|
nano
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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
UW PICO 5.09 File: .zshrc
. ~/.zprofile
source /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop
# Added by Windsurf
export PATH="/Users/lukas/.codeium/windsurf/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}"'
[ Unknown Command: ]
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 \n UW PICO 5.09 File: .zshrc \n\n. ~/.zprofile\n\nsource /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop\n\n# Added by Windsurf\nexport PATH=\"/Users/lukas/.codeium/windsurf/bin:$PATH\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n[ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" # This loads nvm bash_completion\n$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Unknown Command: ] \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","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 \n UW PICO 5.09 File: .zshrc \n\n. ~/.zprofile\n\nsource /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop\n\n# Added by Windsurf\nexport PATH=\"/Users/lukas/.codeium/windsurf/bin:$PATH\"\n\nexport NVM_DIR=\"$HOME/.nvm\"\n[ -s \"$NVM_DIR/nvm.sh\" ] && \\. \"$NVM_DIR/nvm.sh\" # This loads nvm\n[ -s \"$NVM_DIR/bash_completion\" ] && \\. \"$NVM_DIR/bash_completion\" # This loads nvm bash_completion\n$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}\"'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n [ Unknown Command: ] \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","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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":"nano","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"nano","depth":1,"bounds":{"left":0.4875,"top":0.033333335,"width":0.025,"height":0.017777778},"role_description":"text"}]...
|
-6037013225245471503
|
2973105120304191074
|
click
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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
UW PICO 5.09 File: .zshrc
. ~/.zprofile
source /Users/lukas/.docker/init-zsh.sh || true # Added by Docker Desktop
# Added by Windsurf
export PATH="/Users/lukas/.codeium/windsurf/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
$ipeline.capture_fps_actual, frames: .pipeline.frames_captured}"'
[ Unknown Command: ]
^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
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
nano
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
nano...
|
1393
|
|
1395
|
30
|
49
|
2026-04-11T15:47:17.295441+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922437295_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
4837579268199159703
|
2973105120308395616
|
idle
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
1396
|
30
|
50
|
2026-04-11T15:47:47.405103+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922467405_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
302391323801480675
|
2973105120308395616
|
idle
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
1395
|
|
1397
|
30
|
51
|
2026-04-11T15:47:55.621764+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922475621_m1.jpg...
|
Firefox
|
Screenpipe Dashboard — Personal
|
True
|
http://100.73.206.126:8766
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox (1) - [EMAIL] - Gmail
Edit DXP4800PLUS-B5F8
Inbox (1) - [EMAIL] - Gmail
Edit profile
Edit profile
How to Get Through the Product Management Bottleneck
How to Get Through the Product Management Bottleneck
Časť 2 • HBO Max
Časť 2 • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Maďarské voľby – Denník N
Maďarské voľby – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Problem loading page
Problem loading page
Machines - Tailscale
Machines - Tailscale
New Tab
New Tab
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
New Tab
New Tab
New Tab
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
TOTAL SPAN
1.0h
14:52 → 15:54
ACTIVE
1.0h
BREAKS
0 breaks · 0.0h
SESSIONS
1
62m
FRAMES
612
APPS
6
UI EVENTS
1344
AUDIO
0
ACTIVE PERIOD
14:52 → 15:54
TIME PER APP
— CLICK TO FILTER RIGHT PANEL
iTerm2
5.2m
Firefox
1.5m
Finder
0.6m
QuickTime Player
0.5m
NetAuthAgent
0.1m
Raycast
0.1m
Websites
Windows
UI Events
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d
0.1m
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/
0.1m
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
0m
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com
0m...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox (1) - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Edit profile","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Edit profile","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to Get Through the Product Management Bottleneck","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to Get Through the Product Management Bottleneck","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Časť 2 • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Časť 2 • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Maďarské voľby – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Maďarské voľby – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Problem loading page","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Problem loading page","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","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":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe Dashboard","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":"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":"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":"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe","depth":7,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"04","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"TOTAL SPAN","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52 → 15:54","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"BREAKS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0 breaks · 0.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SESSIONS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"62m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"FRAMES","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"612","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"APPS","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"UI EVENTS","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1344","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AUDIO","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE PERIOD","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52 → 15:54","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TIME PER APP","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"— CLICK TO FILTER RIGHT PANEL","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"iTerm2","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5.2m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.5m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finder","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.6m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"QuickTime Player","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.5m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"NetAuthAgent","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Raycast","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Websites","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Windows","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"UI Events","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.7m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/login/account","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"login.tailscale.com/login?next_url=%2Fadmin","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"http://localhost:3030","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
9194064562910267055
|
-5392777572757647826
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox (1) - [EMAIL] - Gmail
Edit DXP4800PLUS-B5F8
Inbox (1) - [EMAIL] - Gmail
Edit profile
Edit profile
How to Get Through the Product Management Bottleneck
How to Get Through the Product Management Bottleneck
Časť 2 • HBO Max
Časť 2 • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Maďarské voľby – Denník N
Maďarské voľby – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Problem loading page
Problem loading page
Machines - Tailscale
Machines - Tailscale
New Tab
New Tab
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
New Tab
New Tab
New Tab
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
TOTAL SPAN
1.0h
14:52 → 15:54
ACTIVE
1.0h
BREAKS
0 breaks · 0.0h
SESSIONS
1
62m
FRAMES
612
APPS
6
UI EVENTS
1344
AUDIO
0
ACTIVE PERIOD
14:52 → 15:54
TIME PER APP
— CLICK TO FILTER RIGHT PANEL
iTerm2
5.2m
Firefox
1.5m
Finder
0.6m
QuickTime Player
0.5m
NetAuthAgent
0.1m
Raycast
0.1m
Websites
Windows
UI Events
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d
0.1m
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/
0.1m
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
0m
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com
0m...
|
NULL
|
|
1400
|
30
|
54
|
2026-04-11T15:48:01.530489+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922481530_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
302391323801480675
|
2973105120308395616
|
click
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
1401
|
30
|
55
|
2026-04-11T15:48:02.882948+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922482882_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
302391323801480675
|
2973105120308395616
|
visual_change
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
1402
|
30
|
56
|
2026-04-11T15:54:14.662984+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775922854662_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
[1] 41216
detected hardware tier: Mid
checking permissions...
screen recording: ok
accessibility: ok
2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T18:54:13.822962Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ 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-11T18:54:13.824479Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-11T18:54:13.824829Z INFO screenpipe: starting UI event capture
2026-04-11T18:54:13.828568Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-11T18:54:13.829646Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-11T18:54:13.838998Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-11T18:54:13.852999Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-11T18:54:13.853108Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 15:54:13.853107 UTC to 2026-04-11 15:54:13.853107 UTC)
2026-04-11T18:54:13.853121Z INFO screenpipe_engine::ui_recorder: UI recording session started: 13f9ef4b-a7db-47ce-844f-778b4b926db5
2026-04-11T18:54:13.854048Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-04-11T18:54:13.859344Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-04-11T18:54:13.864448Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-04-11T18:54:14.006638Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 878 frame entries, coverage from 2026-04-10 15:54:13.853107 UTC
2026-04-11T18:54:14.161101Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-04-11T18:54:14.161134Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-04-11T18:54:14.161145Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list
2026-04-11T18:54:14.161153Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)
2026-04-11T18:54:14.161204Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-04-11T18:54:14.958802Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 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 13 lines ] \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 \n-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n[1] 41216\ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T18:54:13.822962Z 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 │ [] │\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│ │ no monitors available │\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-11T18:54:13.824479Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T18:54:13.824829Z INFO screenpipe: starting UI event capture\n2026-04-11T18:54:13.828568Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T18:54:13.829646Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T18:54:13.838998Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T18:54:13.852999Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T18:54:13.853108Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 15:54:13.853107 UTC to 2026-04-11 15:54:13.853107 UTC)\n2026-04-11T18:54:13.853121Z INFO screenpipe_engine::ui_recorder: UI recording session started: 13f9ef4b-a7db-47ce-844f-778b4b926db5\n2026-04-11T18:54:13.854048Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T18:54:13.859344Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T18:54:13.864448Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T18:54:14.006638Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 878 frame entries, coverage from 2026-04-10 15:54:13.853107 UTC\n2026-04-11T18:54:14.161101Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T18:54:14.161134Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.161145Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T18:54:14.161153Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T18:54:14.161204Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.958802Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 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 13 lines ] \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 \n-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n[1] 41216\ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T18:54:13.822962Z 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 │ [] │\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│ │ no monitors available │\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-11T18:54:13.824479Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T18:54:13.824829Z INFO screenpipe: starting UI event capture\n2026-04-11T18:54:13.828568Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T18:54:13.829646Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T18:54:13.838998Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T18:54:13.852999Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T18:54:13.853108Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 15:54:13.853107 UTC to 2026-04-11 15:54:13.853107 UTC)\n2026-04-11T18:54:13.853121Z INFO screenpipe_engine::ui_recorder: UI recording session started: 13f9ef4b-a7db-47ce-844f-778b4b926db5\n2026-04-11T18:54:13.854048Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T18:54:13.859344Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T18:54:13.864448Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T18:54:14.006638Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 878 frame entries, coverage from 2026-04-10 15:54:13.853107 UTC\n2026-04-11T18:54:14.161101Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T18:54:14.161134Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.161145Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T18:54:14.161153Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T18:54:14.161204Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.958802Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
6682832261097084769
|
2974231020211043936
|
manual
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
[1] 41216
detected hardware tier: Mid
checking permissions...
screen recording: ok
accessibility: ok
2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T18:54:13.822962Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ 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-11T18:54:13.824479Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-11T18:54:13.824829Z INFO screenpipe: starting UI event capture
2026-04-11T18:54:13.828568Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-11T18:54:13.829646Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-11T18:54:13.838998Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-11T18:54:13.852999Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-11T18:54:13.853108Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 15:54:13.853107 UTC to 2026-04-11 15:54:13.853107 UTC)
2026-04-11T18:54:13.853121Z INFO screenpipe_engine::ui_recorder: UI recording session started: 13f9ef4b-a7db-47ce-844f-778b4b926db5
2026-04-11T18:54:13.854048Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-04-11T18:54:13.859344Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-04-11T18:54:13.864448Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-04-11T18:54:14.006638Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 878 frame entries, coverage from 2026-04-10 15:54:13.853107 UTC
2026-04-11T18:54:14.161101Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-04-11T18:54:14.161134Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-04-11T18:54:14.161145Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list
2026-04-11T18:54:14.161153Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)
2026-04-11T18:54:14.161204Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-04-11T18:54:14.958802Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
1403
|
30
|
57
|
2026-04-11T16:00:08.322739+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775923208322_m1.jpg...
|
iTerm2
|
screenpipe"
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
[1] 41216
detected hardware tier: Mid
checking permissions...
screen recording: ok
accessibility: ok
2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T18:54:13.822962Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ 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] ~ $ 2026-04-11T18:54:18.859011Z INFO screenpipe_engine::retention: retention: initialized with 14d retention
2026-04-11T18:54:18.859467Z INFO screenpipe: local retention auto-enabled (14 days)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
[1] + terminated npx screenpipe@latest record --disable-audio
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT DISTINCT window_name
FROM frames
WHERE app_name IN ('Safari', 'Firefox', 'Arc', 'Chrome')
AND window_name IS NOT NULL
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
ORDER BY window_name;"
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8 — Personal
Denník N - Nezávislý denník — Personal
Edit profile — Personal
Location Logger
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N — Personal
Maďarské voľby – Denník N — Personal
Personal — Mozilla Firefox
Picture-in-Picture
Problem loading page — Personal
Screenpipe Dashboard — Personal
Settings — Personal
Sign in – Google accounts — Personal
Tailscale — Personal
UGREEN NAS — Personal
Vimium Options — Personal
Vimium – Get this Extension for 🦊 Firefox (en-US) — Personal
firefox sidebar - Google Search — Personal
tilscale admin panel - Google Search — Personal
Order Room Service • HBO Max
Shameless • HBO Max
Shameless • HBO Max — Personal
Simple Pleasures • HBO Max — Personal
Časť 2 • HBO Max — Personal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cat ~/.screenpipe/config.json
{
"disable_audio": true,
"monitor_ids": ["Display 1_1440x900_0,0", "Display 2_3008x1253_-813,-1253"],
"ignored_windows": [
"1Password",
"Keychain Access",
"Bitwarden",
"System Preferences",
"System Settings",
"zoom.us",
"HBO Max",
]
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe && sleep 2 && npx screenpipe@latest record
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record
detected hardware tier: Mid
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-04-11T19:00:06.546722Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T19:00:07.267955Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T19:00:07.269566Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T19:00:07.269564Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T19:00:07.269921Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T19:00:07.470439Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T19:00:07.470481Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T19:00:07.470420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T19:00:07.470877Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T19:00:07.471071Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T19:00:07.471748Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T19:00:07.471948Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T19:00:07.472085Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T19:00:07.472295Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T19:00:07.472315Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ soundcore AeroClip (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-04-11T19:00:07.473167Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-11T19:00:07.473787Z INFO screenpipe: starting UI event capture
2026-04-11T19:00:07.476515Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-11T19:00:07.485630Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-11T19:00:07.489867Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-11T19:00:07.503670Z INFO screenpipe_engine::ui_recorder: UI recording session started: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2
2026-04-11T19:00:07.503881Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-11T19:00:07.503967Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:07.503966 UTC to 2026-04-11 16:00:07.503966 UTC)
2026-04-11T19:00:07.504283Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-04-11T19:00:07.509408Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-04-11T19:00:07.514386Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-04-11T19:00:07.659978Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 879 frame entries, coverage from 2026-04-10 16:00:07.503966 UTC
2026-04-11T19:00:07.820721Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-04-11T19:00:07.820747Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-04-11T19:00:07.820758Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list
2026-04-11T19:00:07.820766Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)
2026-04-11T19:00:07.820805Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-04-11T19:00:08.565404Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
screenpipe"...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 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 13 lines ] \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 \n-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n[1] 41216\ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T18:54:13.822962Z 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 │ [] │\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│ │ no monitors available │\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-11T18:54:13.824479Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T18:54:13.824829Z INFO screenpipe: starting UI event capture\n2026-04-11T18:54:13.828568Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T18:54:13.829646Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T18:54:13.838998Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T18:54:13.852999Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T18:54:13.853108Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 15:54:13.853107 UTC to 2026-04-11 15:54:13.853107 UTC)\n2026-04-11T18:54:13.853121Z INFO screenpipe_engine::ui_recorder: UI recording session started: 13f9ef4b-a7db-47ce-844f-778b4b926db5\n2026-04-11T18:54:13.854048Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T18:54:13.859344Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T18:54:13.864448Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T18:54:14.006638Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 878 frame entries, coverage from 2026-04-10 15:54:13.853107 UTC\n2026-04-11T18:54:14.161101Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T18:54:14.161134Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.161145Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T18:54:14.161153Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T18:54:14.161204Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.958802Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)\n2026-04-11T18:54:15.096012Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1402, dur=52ms\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-04-11T18:54:18.859011Z INFO screenpipe_engine::retention: retention: initialized with 14d retention\n2026-04-11T18:54:18.859467Z INFO screenpipe: local retention auto-enabled (14 days)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\n[1] + terminated npx screenpipe@latest record --disable-audio \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT DISTINCT window_name\nFROM frames\nWHERE app_name IN ('Safari', 'Firefox', 'Arc', 'Chrome')\nAND window_name IS NOT NULL\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 13 lines ] \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 \nORDER BY window_name;\"\nDXP4800PLUS-B5F8\nDXP4800PLUS-B5F8 — Personal\nDenník N - Nezávislý denník — Personal\nEdit profile — Personal\nLocation Logger\nLoď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N — Personal\nMaďarské voľby – Denník N — Personal\nPersonal — Mozilla Firefox\nPicture-in-Picture\nProblem loading page — Personal\nScreenpipe Dashboard — Personal\nSettings — Personal\nSign in – Google accounts — Personal\nTailscale — Personal\nUGREEN NAS — Personal\nVimium Options — Personal\nVimium – Get this Extension for 🦊\u0000 Firefox (en-US) — Personal\nfirefox sidebar - Google Search — Personal\ntilscale admin panel - Google Search — Personal\nOrder Room Service • HBO Max\nShameless • HBO Max\nShameless • HBO Max — Personal\nSimple Pleasures • HBO Max — Personal\nČasť 2 • HBO Max — Personal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cat ~/.screenpipe/config.json \n{\n \"disable_audio\": true,\n \"monitor_ids\": [\"Display 1_1440x900_0,0\", \"Display 2_3008x1253_-813,-1253\"],\n \"ignored_windows\": [\n \"1Password\",\n \"Keychain Access\",\n \"Bitwarden\",\n \"System Preferences\",\n \"System Settings\",\n \"zoom.us\",\n \"HBO Max\",\n ]\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe && sleep 2 && npx screenpipe@latest record\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record \ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-04-11T19:00:06.546722Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T19:00:07.267955Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T19:00:07.269566Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T19:00:07.269564Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T19:00:07.269921Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T19:00:07.470439Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T19:00:07.470481Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T19:00:07.470420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T19:00:07.470877Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T19:00:07.471071Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T19:00:07.471748Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T19:00:07.471948Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T19:00:07.472085Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T19:00:07.472295Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T19:00:07.472315Z 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 │ [] │\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│ │ no monitors available │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ soundcore AeroClip (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-04-11T19:00:07.473167Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T19:00:07.473787Z INFO screenpipe: starting UI event capture\n2026-04-11T19:00:07.476515Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T19:00:07.485630Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T19:00:07.489867Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T19:00:07.503670Z INFO screenpipe_engine::ui_recorder: UI recording session started: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2\n2026-04-11T19:00:07.503881Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T19:00:07.503967Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:07.503966 UTC to 2026-04-11 16:00:07.503966 UTC)\n2026-04-11T19:00:07.504283Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T19:00:07.509408Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T19:00:07.514386Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T19:00:07.659978Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 879 frame entries, coverage from 2026-04-10 16:00:07.503966 UTC\n2026-04-11T19:00:07.820721Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T19:00:07.820747Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T19:00:07.820758Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T19:00:07.820766Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T19:00:07.820805Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T19:00:08.565404Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 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 13 lines ] \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 \n-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n[1] 41216\ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T18:54:13.822962Z 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 │ [] │\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│ │ no monitors available │\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-11T18:54:13.824479Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T18:54:13.824829Z INFO screenpipe: starting UI event capture\n2026-04-11T18:54:13.828568Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T18:54:13.829646Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T18:54:13.838998Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T18:54:13.852999Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T18:54:13.853108Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 15:54:13.853107 UTC to 2026-04-11 15:54:13.853107 UTC)\n2026-04-11T18:54:13.853121Z INFO screenpipe_engine::ui_recorder: UI recording session started: 13f9ef4b-a7db-47ce-844f-778b4b926db5\n2026-04-11T18:54:13.854048Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T18:54:13.859344Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T18:54:13.864448Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T18:54:14.006638Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 878 frame entries, coverage from 2026-04-10 15:54:13.853107 UTC\n2026-04-11T18:54:14.161101Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T18:54:14.161134Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.161145Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T18:54:14.161153Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T18:54:14.161204Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.958802Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)\n2026-04-11T18:54:15.096012Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1402, dur=52ms\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-04-11T18:54:18.859011Z INFO screenpipe_engine::retention: retention: initialized with 14d retention\n2026-04-11T18:54:18.859467Z INFO screenpipe: local retention auto-enabled (14 days)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\n[1] + terminated npx screenpipe@latest record --disable-audio \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT DISTINCT window_name\nFROM frames\nWHERE app_name IN ('Safari', 'Firefox', 'Arc', 'Chrome')\nAND window_name IS NOT NULL\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 13 lines ] \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 \nORDER BY window_name;\"\nDXP4800PLUS-B5F8\nDXP4800PLUS-B5F8 — Personal\nDenník N - Nezávislý denník — Personal\nEdit profile — Personal\nLocation Logger\nLoď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N — Personal\nMaďarské voľby – Denník N — Personal\nPersonal — Mozilla Firefox\nPicture-in-Picture\nProblem loading page — Personal\nScreenpipe Dashboard — Personal\nSettings — Personal\nSign in – Google accounts — Personal\nTailscale — Personal\nUGREEN NAS — Personal\nVimium Options — Personal\nVimium – Get this Extension for 🦊\u0000 Firefox (en-US) — Personal\nfirefox sidebar - Google Search — Personal\ntilscale admin panel - Google Search — Personal\nOrder Room Service • HBO Max\nShameless • HBO Max\nShameless • HBO Max — Personal\nSimple Pleasures • HBO Max — Personal\nČasť 2 • HBO Max — Personal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cat ~/.screenpipe/config.json \n{\n \"disable_audio\": true,\n \"monitor_ids\": [\"Display 1_1440x900_0,0\", \"Display 2_3008x1253_-813,-1253\"],\n \"ignored_windows\": [\n \"1Password\",\n \"Keychain Access\",\n \"Bitwarden\",\n \"System Preferences\",\n \"System Settings\",\n \"zoom.us\",\n \"HBO Max\",\n ]\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe && sleep 2 && npx screenpipe@latest record\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record \ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-04-11T19:00:06.546722Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T19:00:07.267955Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T19:00:07.269566Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T19:00:07.269564Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T19:00:07.269921Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T19:00:07.470439Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T19:00:07.470481Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T19:00:07.470420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T19:00:07.470877Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T19:00:07.471071Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T19:00:07.471748Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T19:00:07.471948Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T19:00:07.472085Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T19:00:07.472295Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T19:00:07.472315Z 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 │ [] │\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│ │ no monitors available │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ soundcore AeroClip (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-04-11T19:00:07.473167Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T19:00:07.473787Z INFO screenpipe: starting UI event capture\n2026-04-11T19:00:07.476515Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T19:00:07.485630Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T19:00:07.489867Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T19:00:07.503670Z INFO screenpipe_engine::ui_recorder: UI recording session started: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2\n2026-04-11T19:00:07.503881Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T19:00:07.503967Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:07.503966 UTC to 2026-04-11 16:00:07.503966 UTC)\n2026-04-11T19:00:07.504283Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T19:00:07.509408Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T19:00:07.514386Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T19:00:07.659978Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 879 frame entries, coverage from 2026-04-10 16:00:07.503966 UTC\n2026-04-11T19:00:07.820721Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T19:00:07.820747Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T19:00:07.820758Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T19:00:07.820766Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T19:00:07.820805Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T19:00:08.565404Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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.12708333,"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.24583334,"top":0.05888889,"width":0.12291667,"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.25,"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.36875,"top":0.05888889,"width":0.12291667,"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.37291667,"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.49166667,"top":0.05888889,"width":0.12291667,"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":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"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.61875,"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.7375,"top":0.05888889,"width":0.12291667,"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.7416667,"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":"ssh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"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.8645833,"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"}]...
|
-7186146091712467513
|
2983095300134698080
|
manual
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
[1] 41216
detected hardware tier: Mid
checking permissions...
screen recording: ok
accessibility: ok
2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T18:54:13.822962Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ 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] ~ $ 2026-04-11T18:54:18.859011Z INFO screenpipe_engine::retention: retention: initialized with 14d retention
2026-04-11T18:54:18.859467Z INFO screenpipe: local retention auto-enabled (14 days)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
[1] + terminated npx screenpipe@latest record --disable-audio
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT DISTINCT window_name
FROM frames
WHERE app_name IN ('Safari', 'Firefox', 'Arc', 'Chrome')
AND window_name IS NOT NULL
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
ORDER BY window_name;"
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8 — Personal
Denník N - Nezávislý denník — Personal
Edit profile — Personal
Location Logger
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N — Personal
Maďarské voľby – Denník N — Personal
Personal — Mozilla Firefox
Picture-in-Picture
Problem loading page — Personal
Screenpipe Dashboard — Personal
Settings — Personal
Sign in – Google accounts — Personal
Tailscale — Personal
UGREEN NAS — Personal
Vimium Options — Personal
Vimium – Get this Extension for 🦊 Firefox (en-US) — Personal
firefox sidebar - Google Search — Personal
tilscale admin panel - Google Search — Personal
Order Room Service • HBO Max
Shameless • HBO Max
Shameless • HBO Max — Personal
Simple Pleasures • HBO Max — Personal
Časť 2 • HBO Max — Personal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cat ~/.screenpipe/config.json
{
"disable_audio": true,
"monitor_ids": ["Display 1_1440x900_0,0", "Display 2_3008x1253_-813,-1253"],
"ignored_windows": [
"1Password",
"Keychain Access",
"Bitwarden",
"System Preferences",
"System Settings",
"zoom.us",
"HBO Max",
]
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe && sleep 2 && npx screenpipe@latest record
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record
detected hardware tier: Mid
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-04-11T19:00:06.546722Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T19:00:07.267955Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T19:00:07.269566Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T19:00:07.269564Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T19:00:07.269921Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T19:00:07.470439Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T19:00:07.470481Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T19:00:07.470420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T19:00:07.470877Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T19:00:07.471071Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T19:00:07.471748Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T19:00:07.471948Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T19:00:07.472085Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T19:00:07.472295Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T19:00:07.472315Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ soundcore AeroClip (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-04-11T19:00:07.473167Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-11T19:00:07.473787Z INFO screenpipe: starting UI event capture
2026-04-11T19:00:07.476515Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-11T19:00:07.485630Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-11T19:00:07.489867Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-11T19:00:07.503670Z INFO screenpipe_engine::ui_recorder: UI recording session started: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2
2026-04-11T19:00:07.503881Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-11T19:00:07.503967Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:07.503966 UTC to 2026-04-11 16:00:07.503966 UTC)
2026-04-11T19:00:07.504283Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-04-11T19:00:07.509408Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-04-11T19:00:07.514386Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-04-11T19:00:07.659978Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 879 frame entries, coverage from 2026-04-10 16:00:07.503966 UTC
2026-04-11T19:00:07.820721Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-04-11T19:00:07.820747Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-04-11T19:00:07.820758Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list
2026-04-11T19:00:07.820766Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)
2026-04-11T19:00:07.820805Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-04-11T19:00:08.565404Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
screenpipe"...
|
NULL
|
|
1405
|
30
|
59
|
2026-04-11T16:00:39.636032+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775923239636_m1.jpg...
|
Firefox
|
Screenpipe Dashboard — Personal
|
True
|
http://100.73.206.126:8766
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Edit prof DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Edit profile
Edit profile
How to Get Through the Product Management Bottleneck
How to Get Through the Product Management Bottleneck
Časť 3 • HBO Max
Mute tab
Časť 3 • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Maďarské voľby – Denník N
Maďarské voľby – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
TOTAL SPAN
1.0h
14:52 → 15:54
ACTIVE
1.0h
BREAKS
0 breaks · 0.0h
SESSIONS
1
62m
FRAMES
612
APPS
6
UI EVENTS
1344
AUDIO
0
ACTIVE PERIOD
14:52 → 15:54
TIME PER APP
— CLICK TO FILTER RIGHT PANEL
iTerm2
5.2m
Firefox
1.5m
Finder
0.6m
QuickTime Player
0.5m
NetAuthAgent
0.1m
Raycast
0.1m
Websites
Windows
UI Events
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d
0.1m
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/
0.1m
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
0m
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com
0m...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Edit profile","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Edit profile","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to Get Through the Product Management Bottleneck","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to Get Through the Product Management Bottleneck","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Časť 3 • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Mute tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Časť 3 • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Maďarské voľby – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Maďarské voľby – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe Dashboard","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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe","depth":7,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"04","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"TOTAL SPAN","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52 → 15:54","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"BREAKS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0 breaks · 0.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SESSIONS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"62m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"FRAMES","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"612","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"APPS","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"UI EVENTS","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1344","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AUDIO","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE PERIOD","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52 → 15:54","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TIME PER APP","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"— CLICK TO FILTER RIGHT PANEL","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"iTerm2","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5.2m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.5m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finder","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.6m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"QuickTime Player","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.5m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"NetAuthAgent","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Raycast","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Websites","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Windows","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"UI Events","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.7m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/login/account","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"login.tailscale.com/login?next_url=%2Fadmin","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"http://localhost:3030","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
308005514077572572
|
-5356679506506135954
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Edit prof DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Edit profile
Edit profile
How to Get Through the Product Management Bottleneck
How to Get Through the Product Management Bottleneck
Časť 3 • HBO Max
Mute tab
Časť 3 • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Maďarské voľby – Denník N
Maďarské voľby – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
TOTAL SPAN
1.0h
14:52 → 15:54
ACTIVE
1.0h
BREAKS
0 breaks · 0.0h
SESSIONS
1
62m
FRAMES
612
APPS
6
UI EVENTS
1344
AUDIO
0
ACTIVE PERIOD
14:52 → 15:54
TIME PER APP
— CLICK TO FILTER RIGHT PANEL
iTerm2
5.2m
Firefox
1.5m
Finder
0.6m
QuickTime Player
0.5m
NetAuthAgent
0.1m
Raycast
0.1m
Websites
Windows
UI Events
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d
0.1m
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/
0.1m
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
0m
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com
0m...
|
1404
|
|
1406
|
NULL
|
0
|
2026-04-11T16:00:40.640295+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775923240640_m1.jpg...
|
iTerm2
|
screenpipe"
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
[1] 41216
detected hardware tier: Mid
checking permissions...
screen recording: ok
accessibility: ok
2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T18:54:13.822962Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ 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] ~ $ 2026-04-11T18:54:18.859011Z INFO screenpipe_engine::retention: retention: initialized with 14d retention
2026-04-11T18:54:18.859467Z INFO screenpipe: local retention auto-enabled (14 days)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
[1] + terminated npx screenpipe@latest record --disable-audio
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT DISTINCT window_name
FROM frames
WHERE app_name IN ('Safari', 'Firefox', 'Arc', 'Chrome')
AND window_name IS NOT NULL
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
ORDER BY window_name;"
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8 — Personal
Denník N - Nezávislý denník — Personal
Edit profile — Personal
Location Logger
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N — Personal
Maďarské voľby – Denník N — Personal
Personal — Mozilla Firefox
Picture-in-Picture
Problem loading page — Personal
Screenpipe Dashboard — Personal
Settings — Personal
Sign in – Google accounts — Personal
Tailscale — Personal
UGREEN NAS — Personal
Vimium Options — Personal
Vimium – Get this Extension for 🦊 Firefox (en-US) — Personal
firefox sidebar - Google Search — Personal
tilscale admin panel - Google Search — Personal
Order Room Service • HBO Max
Shameless • HBO Max
Shameless • HBO Max — Personal
Simple Pleasures • HBO Max — Personal
Časť 2 • HBO Max — Personal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cat ~/.screenpipe/config.json
{
"disable_audio": true,
"monitor_ids": ["Display 1_1440x900_0,0", "Display 2_3008x1253_-813,-1253"],
"ignored_windows": [
"1Password",
"Keychain Access",
"Bitwarden",
"System Preferences",
"System Settings",
"zoom.us",
"HBO Max",
]
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe && sleep 2 && npx screenpipe@latest record
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record
detected hardware tier: Mid
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-04-11T19:00:06.546722Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T19:00:07.267955Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T19:00:07.269566Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T19:00:07.269564Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T19:00:07.269921Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T19:00:07.470439Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T19:00:07.470481Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T19:00:07.470420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T19:00:07.470877Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T19:00:07.471071Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T19:00:07.471748Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T19:00:07.471948Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T19:00:07.472085Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T19:00:07.472295Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T19:00:07.472315Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ soundcore AeroClip (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-04-11T19:00:14.624523Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2
2026-04-11T19:00:14.624669Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record
detected hardware tier: Mid
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-04-11T19:00:31.694964Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T19:00:32.442217Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T19:00:32.443687Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T19:00:32.443694Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T19:00:32.444120Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T19:00:32.662907Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T19:00:32.662887Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T19:00:32.662980Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T19:00:32.663355Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T19:00:32.663550Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T19:00:32.664216Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T19:00:32.664395Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T19:00:32.664552Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T19:00:32.665488Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T19:00:32.665515Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ soundcore AeroClip (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-04-11T19:00:32.667186Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-11T19:00:32.667286Z INFO screenpipe: starting UI event capture
2026-04-11T19:00:32.670076Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-11T19:00:32.672989Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-11T19:00:32.681327Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-11T19:00:32.695244Z INFO screenpipe_engine::ui_recorder: UI recording session started: 47668625-ff04-42f8-aa0d-f468ff11f0ff
2026-04-11T19:00:32.695238Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-11T19:00:32.695298Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:32.695296 UTC to 2026-04-11 16:00:32.695296 UTC)
2026-04-11T19:00:32.695769Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-04-11T19:00:32.701263Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-04-11T19:00:32.705041Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-04-11T19:00:32.852998Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 880 frame entries, coverage from 2026-04-10 16:00:32.695296 UTC
2026-04-11T19:00:32.998691Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-04-11T19:00:32.998717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-04-11T19:00:32.998728Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list
2026-04-11T19:00:32.998739Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)
2026-04-11T19:00:32.998790Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-04-11T19:00:33.736410Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)
2026-04-11T19:00:34.302357Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1404, dur=507ms
2026-04-11T19:00:37.699366Z INFO screenpipe_engine::retention: retention: initialized with 14d retention
2026-04-11T19:00:37.699830Z INFO screenpipe: local retention auto-enabled (14 days)
DOCKER
Close Tab
DEV (-zsh)
Close Tab...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 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 13 lines ] \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 \n-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n[1] 41216\ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T18:54:13.822962Z 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 │ [] │\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│ │ no monitors available │\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-11T18:54:13.824479Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T18:54:13.824829Z INFO screenpipe: starting UI event capture\n2026-04-11T18:54:13.828568Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T18:54:13.829646Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T18:54:13.838998Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T18:54:13.852999Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T18:54:13.853108Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 15:54:13.853107 UTC to 2026-04-11 15:54:13.853107 UTC)\n2026-04-11T18:54:13.853121Z INFO screenpipe_engine::ui_recorder: UI recording session started: 13f9ef4b-a7db-47ce-844f-778b4b926db5\n2026-04-11T18:54:13.854048Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T18:54:13.859344Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T18:54:13.864448Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T18:54:14.006638Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 878 frame entries, coverage from 2026-04-10 15:54:13.853107 UTC\n2026-04-11T18:54:14.161101Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T18:54:14.161134Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.161145Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T18:54:14.161153Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T18:54:14.161204Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.958802Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)\n2026-04-11T18:54:15.096012Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1402, dur=52ms\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-04-11T18:54:18.859011Z INFO screenpipe_engine::retention: retention: initialized with 14d retention\n2026-04-11T18:54:18.859467Z INFO screenpipe: local retention auto-enabled (14 days)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\n[1] + terminated npx screenpipe@latest record --disable-audio \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT DISTINCT window_name\nFROM frames\nWHERE app_name IN ('Safari', 'Firefox', 'Arc', 'Chrome')\nAND window_name IS NOT NULL\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 13 lines ] \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 \nORDER BY window_name;\"\nDXP4800PLUS-B5F8\nDXP4800PLUS-B5F8 — Personal\nDenník N - Nezávislý denník — Personal\nEdit profile — Personal\nLocation Logger\nLoď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N — Personal\nMaďarské voľby – Denník N — Personal\nPersonal — Mozilla Firefox\nPicture-in-Picture\nProblem loading page — Personal\nScreenpipe Dashboard — Personal\nSettings — Personal\nSign in – Google accounts — Personal\nTailscale — Personal\nUGREEN NAS — Personal\nVimium Options — Personal\nVimium – Get this Extension for 🦊\u0000 Firefox (en-US) — Personal\nfirefox sidebar - Google Search — Personal\ntilscale admin panel - Google Search — Personal\nOrder Room Service • HBO Max\nShameless • HBO Max\nShameless • HBO Max — Personal\nSimple Pleasures • HBO Max — Personal\nČasť 2 • HBO Max — Personal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cat ~/.screenpipe/config.json \n{\n \"disable_audio\": true,\n \"monitor_ids\": [\"Display 1_1440x900_0,0\", \"Display 2_3008x1253_-813,-1253\"],\n \"ignored_windows\": [\n \"1Password\",\n \"Keychain Access\",\n \"Bitwarden\",\n \"System Preferences\",\n \"System Settings\",\n \"zoom.us\",\n \"HBO Max\",\n ]\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe && sleep 2 && npx screenpipe@latest record\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record \ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-04-11T19:00:06.546722Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T19:00:07.267955Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T19:00:07.269566Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T19:00:07.269564Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T19:00:07.269921Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T19:00:07.470439Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T19:00:07.470481Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T19:00:07.470420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T19:00:07.470877Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T19:00:07.471071Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T19:00:07.471748Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T19:00:07.471948Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T19:00:07.472085Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T19:00:07.472295Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T19:00:07.472315Z 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 │ [] │\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│ │ no monitors available │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ soundcore AeroClip (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-04-11T19:00:07.473167Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T19:00:07.473787Z INFO screenpipe: starting UI event capture\n2026-04-11T19:00:07.476515Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T19:00:07.485630Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T19:00:07.489867Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T19:00:07.503670Z INFO screenpipe_engine::ui_recorder: UI recording session started: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2\n2026-04-11T19:00:07.503881Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T19:00:07.503967Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:07.503966 UTC to 2026-04-11 16:00:07.503966 UTC)\n2026-04-11T19:00:07.504283Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T19:00:07.509408Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T19:00:07.514386Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T19:00:07.659978Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 879 frame entries, coverage from 2026-04-10 16:00:07.503966 UTC\n2026-04-11T19:00:07.820721Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T19:00:07.820747Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T19:00:07.820758Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T19:00:07.820766Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T19:00:07.820805Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T19:00:08.565404Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)\n2026-04-11T19:00:08.709384Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1403, dur=60ms\n2026-04-11T19:00:12.507772Z INFO screenpipe_engine::retention: retention: initialized with 14d retention\n2026-04-11T19:00:12.508217Z INFO screenpipe: local retention auto-enabled (14 days)\n^C2026-04-11T19:00:14.475068Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-11T19:00:14.476266Z INFO screenpipe: stopping UI event capture\n2026-04-11T19:00:14.476480Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-11T19:00:14.476552Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-11T19:00:14.476564Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-11T19:00:14.476595Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-11T19:00:14.477268Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n\n2026-04-11T19:00:14.481053Z INFO sck_rs::stream_manager: stopped 1 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-04-11T19:00:14.624523Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2\n2026-04-11T19:00:14.624669Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record\ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-04-11T19:00:31.694964Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T19:00:32.442217Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T19:00:32.443687Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T19:00:32.443694Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T19:00:32.444120Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T19:00:32.662907Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T19:00:32.662887Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T19:00:32.662980Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T19:00:32.663355Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T19:00:32.663550Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T19:00:32.664216Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T19:00:32.664395Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T19:00:32.664552Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T19:00:32.665488Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T19:00:32.665515Z 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 │ [] │\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│ │ no monitors available │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ soundcore AeroClip (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-04-11T19:00:32.667186Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T19:00:32.667286Z INFO screenpipe: starting UI event capture\n2026-04-11T19:00:32.670076Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T19:00:32.672989Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T19:00:32.681327Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T19:00:32.695244Z INFO screenpipe_engine::ui_recorder: UI recording session started: 47668625-ff04-42f8-aa0d-f468ff11f0ff\n2026-04-11T19:00:32.695238Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T19:00:32.695298Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:32.695296 UTC to 2026-04-11 16:00:32.695296 UTC)\n2026-04-11T19:00:32.695769Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T19:00:32.701263Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T19:00:32.705041Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T19:00:32.852998Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 880 frame entries, coverage from 2026-04-10 16:00:32.695296 UTC\n2026-04-11T19:00:32.998691Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T19:00:32.998717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T19:00:32.998728Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T19:00:32.998739Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T19:00:32.998790Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T19:00:33.736410Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)\n2026-04-11T19:00:34.302357Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1404, dur=507ms\n2026-04-11T19:00:37.699366Z INFO screenpipe_engine::retention: retention: initialized with 14d retention\n2026-04-11T19:00:37.699830Z INFO screenpipe: local retention auto-enabled (14 days)","depth":4,"value":"drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe\numount: unmount(/Volumes/screenpipe): Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt\ntouch: /Volumes/screenpipe/test.txt: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/\nscp: dest open \"/volume1/screenpipe/\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: bad pattern: unmount(/Volumes/screenpipe):\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: touch:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: cp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: scp:\nzsh: command not found: scp:\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nzsh: command not found: total\nzsh: command not found: drwxr-xr-x\nzsh: command not found: drwxr-xr-x\nzsh: file exists: /\nzsh: command not found: drwx------\nzsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@100.73.206.126:/volume1/screenpipe/db.sqlite\nscp: dest open \"/volume1/screenpipe/db.sqlite\": No such file or directory\nscp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls \nMacintosh HD\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 32\ndrwxr-xr-x 4 root wheel 128 11 Apr 16:35 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite\ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite\ncp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/ \ncp: directory /Volumes/Test/screenpipe does not exist\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/ \ncp: /Volumes/screenpipe/db.sqlite: Operation not permitted\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll\ntotal 96\ndrwxr-xr-x 6 root wheel 192 11 Apr 16:45 .\ndrwxr-xr-x 20 root wheel 640 4 Aug 2024 ..\ndrwx------ 1 lukas staff 16384 10 Aug 2025 Apps\nlrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /\ndrwx------ 1 lukas staff 16384 11 Apr 15:46 Test\ndrwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/ \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh\nzsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh \n#!/bin/zsh\nDB=\"$HOME/.screenpipe/db.sqlite\"\nDATE=${1:-$(date -v-1d '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho \"\\n📱\u0000 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d', \n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho \"\\n🌐\u0000 BROWSER URLS VISITED\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🪟\u0000 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT \n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3030 after 0 ms: Couldn't connect to server\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST http://localhost:3030/pipes/time-breakdown/run | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 70 100 70 0 0 11194 0 --:--:-- --:--:-- --:--:-- 11666\n{\n \"error\": \"agent 'pi' is not installed — run ensure_installed first\"\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl http://localhost:3030/health | jq .\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n100 943 100 943 0 0 574k 0 --:--:-- --:--:-- --:--:-- 920k\n{\n \"audio_db_write_stalled\": false,\n \"audio_status\": \"disabled\",\n \"device_status_details\": null,\n \"drm_content_paused\": false,\n \"frame_status\": \"ok\",\n \"hostname\": \"Lukas-Kovaliks-MacBook-Pro-Jiminny\",\n \"last_audio_timestamp\": null,\n \"last_frame_timestamp\": \"2026-04-11T18:42:01+03:00\",\n \"message\": \"all systems are functioning normally.\",\n \"monitors\": [\n \"Display 1 (1440x900)\",\n \"Display 2 (2560x1440)\"\n ],\n \"pipeline\": {\n \"avg_db_latency_ms\": 56.5,\n \"avg_ocr_latency_ms\": 0.0,\n \"capture_fps_actual\": 0.5718911974206078,\n \"frame_drop_rate\": 0.0,\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 134 lines ] \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 \n \"frames_captured\": 2,\n \"frames_db_written\": 2,\n \"frames_dropped\": 0,\n \"ocr_cache_hit_rate\": 0.0,\n \"ocr_queue_depth\": 0,\n \"pipeline_stall_count\": 0,\n \"time_to_first_frame_ms\": 1250.985,\n \"uptime_secs\": 3.497168708,\n \"video_queue_depth\": 0\n },\n \"pool_stats\": {\n \"read_pool_idle\": 3,\n \"read_pool_size\": 3,\n \"write_pool_idle\": 2,\n \"write_pool_size\": 2\n },\n \"schedule_paused\": false,\n \"status\": \"healthy\",\n \"status_code\": 200,\n \"verbose_instructions\": null,\n \"version\": \"0.3.278\",\n \"vision_db_write_stalled\": false\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -s http://localhost:3030/health | jq '{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}'\n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:43:24+03:00\",\n \"uptime\": 85.845911708,\n \"fps\": 0.198029232397514,\n \"frames\": 17\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zshrc\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status\nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Volumes or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status \nzsh: command not found: sp-status\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls\nApps\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMacintosh HD\u0000\u0000\u0000\tTest\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 18:38 .\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 22532 11 Apr 16:46 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe\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 11 lines ] \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 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 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\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 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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 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 13 lines ] \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 \n-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 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\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo \"alias sp-status='curl -s http://localhost:3030/health | jq \\\"{status, frame_status, audio_status, last_frame: .last_frame_timestamp, uptime: .pipeline.uptime_secs, fps: .pipeline.capture_fps_actual, frames: .pipeline.frames_captured}\\\"'\" >> ~/.zprofile\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ source ~/.zprofile\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status \n{\n \"status\": \"healthy\",\n \"frame_status\": \"ok\",\n \"audio_status\": \"disabled\",\n \"last_frame\": \"2026-04-11T18:47:17+03:00\",\n \"uptime\": 345.971219541,\n \"fps\": 0.0982740704417778,\n \"frames\": 34\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n[1] 41216\ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n accessibility: ok\n2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T18:54:13.822962Z 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 │ [] │\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│ │ no monitors available │\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-11T18:54:13.824479Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T18:54:13.824829Z INFO screenpipe: starting UI event capture\n2026-04-11T18:54:13.828568Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T18:54:13.829646Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T18:54:13.838998Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T18:54:13.852999Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T18:54:13.853108Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 15:54:13.853107 UTC to 2026-04-11 15:54:13.853107 UTC)\n2026-04-11T18:54:13.853121Z INFO screenpipe_engine::ui_recorder: UI recording session started: 13f9ef4b-a7db-47ce-844f-778b4b926db5\n2026-04-11T18:54:13.854048Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T18:54:13.859344Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T18:54:13.864448Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T18:54:14.006638Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 878 frame entries, coverage from 2026-04-10 15:54:13.853107 UTC\n2026-04-11T18:54:14.161101Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T18:54:14.161134Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.161145Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T18:54:14.161153Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T18:54:14.161204Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T18:54:14.958802Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)\n2026-04-11T18:54:15.096012Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1402, dur=52ms\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-04-11T18:54:18.859011Z INFO screenpipe_engine::retention: retention: initialized with 14d retention\n2026-04-11T18:54:18.859467Z INFO screenpipe: local retention auto-enabled (14 days)\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop\nscreenpipe stopped\n[1] + terminated npx screenpipe@latest record --disable-audio \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT DISTINCT window_name\nFROM frames\nWHERE app_name IN ('Safari', 'Firefox', 'Arc', 'Chrome')\nAND window_name IS NOT NULL\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 13 lines ] \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 \nORDER BY window_name;\"\nDXP4800PLUS-B5F8\nDXP4800PLUS-B5F8 — Personal\nDenník N - Nezávislý denník — Personal\nEdit profile — Personal\nLocation Logger\nLoď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N — Personal\nMaďarské voľby – Denník N — Personal\nPersonal — Mozilla Firefox\nPicture-in-Picture\nProblem loading page — Personal\nScreenpipe Dashboard — Personal\nSettings — Personal\nSign in – Google accounts — Personal\nTailscale — Personal\nUGREEN NAS — Personal\nVimium Options — Personal\nVimium – Get this Extension for 🦊\u0000 Firefox (en-US) — Personal\nfirefox sidebar - Google Search — Personal\ntilscale admin panel - Google Search — Personal\nOrder Room Service • HBO Max\nShameless • HBO Max\nShameless • HBO Max — Personal\nSimple Pleasures • HBO Max — Personal\nČasť 2 • HBO Max — Personal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cat ~/.screenpipe/config.json \n{\n \"disable_audio\": true,\n \"monitor_ids\": [\"Display 1_1440x900_0,0\", \"Display 2_3008x1253_-813,-1253\"],\n \"ignored_windows\": [\n \"1Password\",\n \"Keychain Access\",\n \"Bitwarden\",\n \"System Preferences\",\n \"System Settings\",\n \"zoom.us\",\n \"HBO Max\",\n ]\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe && sleep 2 && npx screenpipe@latest record\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record \ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-04-11T19:00:06.546722Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T19:00:07.267955Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T19:00:07.269566Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T19:00:07.269564Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T19:00:07.269921Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T19:00:07.470439Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T19:00:07.470481Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T19:00:07.470420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T19:00:07.470877Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T19:00:07.471071Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T19:00:07.471748Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T19:00:07.471948Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T19:00:07.472085Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T19:00:07.472295Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T19:00:07.472315Z 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 │ [] │\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│ │ no monitors available │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ soundcore AeroClip (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-04-11T19:00:07.473167Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T19:00:07.473787Z INFO screenpipe: starting UI event capture\n2026-04-11T19:00:07.476515Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T19:00:07.485630Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T19:00:07.489867Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T19:00:07.503670Z INFO screenpipe_engine::ui_recorder: UI recording session started: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2\n2026-04-11T19:00:07.503881Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T19:00:07.503967Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:07.503966 UTC to 2026-04-11 16:00:07.503966 UTC)\n2026-04-11T19:00:07.504283Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T19:00:07.509408Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T19:00:07.514386Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T19:00:07.659978Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 879 frame entries, coverage from 2026-04-10 16:00:07.503966 UTC\n2026-04-11T19:00:07.820721Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T19:00:07.820747Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T19:00:07.820758Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T19:00:07.820766Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T19:00:07.820805Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T19:00:08.565404Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)\n2026-04-11T19:00:08.709384Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1403, dur=60ms\n2026-04-11T19:00:12.507772Z INFO screenpipe_engine::retention: retention: initialized with 14d retention\n2026-04-11T19:00:12.508217Z INFO screenpipe: local retention auto-enabled (14 days)\n^C2026-04-11T19:00:14.475068Z INFO screenpipe: received ctrl+c, initiating shutdown\n2026-04-11T19:00:14.476266Z INFO screenpipe: stopping UI event capture\n2026-04-11T19:00:14.476480Z INFO screenpipe: received shutdown signal for VisionManager\n2026-04-11T19:00:14.476552Z INFO screenpipe_engine::vision_manager::manager: Shutting down VisionManager\n2026-04-11T19:00:14.476564Z INFO screenpipe_engine::vision_manager::manager: Stopping VisionManager\n2026-04-11T19:00:14.476595Z INFO screenpipe_engine::vision_manager::manager: Stopping vision recording for monitor 1\n2026-04-11T19:00:14.477268Z INFO screenpipe_engine::meeting_detector: meeting v2: shutdown received, exiting detection loop\n\n2026-04-11T19:00:14.481053Z INFO sck_rs::stream_manager: stopped 1 persistent stream(s) \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ 2026-04-11T19:00:14.624523Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2\n2026-04-11T19:00:14.624669Z INFO screenpipe: shutdown complete\n\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record\ndetected hardware tier: Mid\nchecking permissions...\n screen recording: ok\n microphone: ok\n accessibility: ok\n2026-04-11T19:00:31.694964Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6\n2026-04-11T19:00:32.442217Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor\n2026-04-11T19:00:32.443687Z INFO screenpipe: meeting detector enabled — independent of transcription mode\n2026-04-11T19:00:32.443694Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)\n2026-04-11T19:00:32.444120Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)\n2026-04-11T19:00:32.662907Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)\n2026-04-11T19:00:32.662887Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)\n2026-04-11T19:00:32.662980Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager\n2026-04-11T19:00:32.663355Z INFO screenpipe_core::pipes: loaded pipe: day-recap\n2026-04-11T19:00:32.663550Z INFO screenpipe_core::pipes: loaded pipe: standup-update\n2026-04-11T19:00:32.664216Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\n2026-04-11T19:00:32.664395Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown\n2026-04-11T19:00:32.664552Z INFO screenpipe_core::pipes: loaded pipe: video-export\n2026-04-11T19:00:32.665488Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary\n2026-04-11T19:00:32.665515Z 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 │ [] │\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│ │ no monitors available │\n├────────────────────────┼────────────────────────────────────┤\n│ audio devices │ │\n│ │ soundcore AeroClip (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-04-11T19:00:32.667186Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)\n2026-04-11T19:00:32.667286Z INFO screenpipe: starting UI event capture\n2026-04-11T19:00:32.670076Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh\n2026-04-11T19:00:32.672989Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))\n2026-04-11T19:00:32.681327Z INFO screenpipe_engine::ui_recorder: Starting UI event capture\n2026-04-11T19:00:32.695244Z INFO screenpipe_engine::ui_recorder: UI recording session started: 47668625-ff04-42f8-aa0d-f468ff11f0ff\n2026-04-11T19:00:32.695238Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)\n2026-04-11T19:00:32.695298Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:32.695296 UTC to 2026-04-11 16:00:32.695296 UTC)\n2026-04-11T19:00:32.695769Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)\n2026-04-11T19:00:32.701263Z INFO screenpipe_engine::server: Server listening on 0.0.0.0:3030\n2026-04-11T19:00:32.705041Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030\n2026-04-11T19:00:32.852998Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 880 frame entries, coverage from 2026-04-10 16:00:32.695296 UTC\n2026-04-11T19:00:32.998691Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)\n2026-04-11T19:00:32.998717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)\n2026-04-11T19:00:32.998728Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list\n2026-04-11T19:00:32.998739Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)\n2026-04-11T19:00:32.998790Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)\n2026-04-11T19:00:33.736410Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)\n2026-04-11T19:00:34.302357Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1404, dur=507ms\n2026-04-11T19:00:37.699366Z INFO screenpipe_engine::retention: retention: initialized with 14d retention\n2026-04-11T19:00:37.699830Z INFO screenpipe: local retention auto-enabled (14 days)","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"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.12291667,"top":0.05888889,"width":0.12291667,"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,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-2662214128234398322
|
4136016804608406624
|
click
|
accessibility
|
NULL
|
drwx------ 1 lukas staff 16384 11 Apr 16:34 sc drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ umount /Volumes/screenpipe
umount: unmount(/Volumes/screenpipe): Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ touch /Volumes/screenpipe/test.txt
touch: /Volumes/screenpipe/test.txt: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/
scp: dest open "/volume1/screenpipe/": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $clear
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: bad pattern: unmount(/Volumes/screenpipe):
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: touch:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: cp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: scp:
zsh: command not found: scp:
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
zsh: command not found: total
zsh: command not found: drwxr-xr-x
zsh: command not found: drwxr-xr-x
zsh: file exists: /
zsh: command not found: drwx------
zsh: command not found: lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ scp ~/.screenpipe/db.sqlite Adm1n@[IP_ADDRESS]:/volume1/screenpipe/db.sqlite
scp: dest open "/volume1/screenpipe/db.sqlite": No such file or directory
scp: failed to upload file /Users/lukas/.screenpipe/db.sqlite to /volume1/screenpipe/db.sqlite
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Macintosh HD screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 32
drwxr-xr-x 4 root wheel 128 11 Apr 16:35 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 16:34 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/db.sqlite
cp: /Volumes/Test/screenpipe/db.sqlite: No such file or directory
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
cp: directory /Volumes/Test/screenpipe does not exist
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/Test/screenpipe/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/db.sqlite
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp ~/.screenpipe/db.sqlite /Volumes/screenpipe/
cp: /Volumes/screenpipe/db.sqlite: Operation not permitted
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ll
total 96
drwxr-xr-x 6 root wheel 192 11 Apr 16:45 .
drwxr-xr-x 20 root wheel 640 4 Aug 2024 ..
drwx------ 1 lukas staff 16384 10 Aug 2025 Apps
lrwxr-xr-x 1 root wheel 1 11 Apr 11:13 Macintosh HD -> /
drwx------ 1 lukas staff 16384 11 Apr 15:46 Test
drwx------ 1 lukas staff 16384 11 Apr 16:47 screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/pipes/ /Volumes/Test/screenpipe/pipes/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cp -r ~/.screenpipe/data/data/ /Volumes/Test/screenpipe/data/
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sed 's|$HOME/.screenpipe/db.sqlite|/volume1/Test/screenpipe/db.sqlite|g' ~/screenpipe-day.sh > /volume1/Test/screenpipe/screenpipe-day.sh
zsh: no such file or directory: /volume1/Test/screenpipe/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cat ~/screenpipe-day.sh
#!/bin/zsh
DB="$HOME/.screenpipe/db.sqlite"
DATE=${1:-$(date -v-1d '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo "\n🌐 BROWSER URLS VISITED"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl -X POST [URL_WITH_CREDENTIALS] /Volumes $ curl [URL_WITH_CREDENTIALS] /Volumes $ curl -s [URL_WITH_CREDENTIALS] /Volumes $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Volumes or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ sp-status
zsh: command not found: sp-status
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ zp
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ ls
Apps Macintosh HD Test screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny /Volumes $ cd
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 18:38 .
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 22532 11 Apr 16:46 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .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 77 9 Feb 2023 .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 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .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 9 Apr 18:24 .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 31 Mar 18:32 .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------ 9 lukas staff 288 11 Apr 18:41 .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 10 lukas staff 320 11 Apr 14:52 .screenpipe
UW PICO 5.09 New Buffer
[ Read 11 lines ]
^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 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 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
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 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .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
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
-rw------- 1 lukas staff 28812 11 Apr 18:38 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 597 11 Apr 18:44 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 10 lukas staff 320 11 Apr 18:31 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 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
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 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 ~ $ nano .zshrc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ echo "alias sp-status='curl -s [URL_WITH_CREDENTIALS] ~ $ source ~/.zprofile
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-status
{
"status": "healthy",
"frame_status": "ok",
"audio_status": "disabled",
"last_frame": "2026-04-11T18:47:17+03:00",
"uptime": 345.971219541,
"fps": 0.[CREDIT_CARD],
"frames": 34
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start
[1] 41216
detected hardware tier: Mid
checking permissions...
screen recording: ok
accessibility: ok
2026-04-11T18:54:13.170097Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T18:54:13.812964Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T18:54:13.819889Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T18:54:13.819889Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T18:54:13.820291Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T18:54:13.820220Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T18:54:13.820450Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T18:54:13.820896Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T18:54:13.820856Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T18:54:13.821123Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T18:54:13.821801Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T18:54:13.821972Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T18:54:13.822128Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T18:54:13.822942Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T18:54:13.822962Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ 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] ~ $ 2026-04-11T18:54:18.859011Z INFO screenpipe_engine::retention: retention: initialized with 14d retention
2026-04-11T18:54:18.859467Z INFO screenpipe: local retention auto-enabled (14 days)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-stop
screenpipe stopped
[1] + terminated npx screenpipe@latest record --disable-audio
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT DISTINCT window_name
FROM frames
WHERE app_name IN ('Safari', 'Firefox', 'Arc', 'Chrome')
AND window_name IS NOT NULL
UW PICO 5.09 New Buffer
[ Read 13 lines ]
^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
ORDER BY window_name;"
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8 — Personal
Denník N - Nezávislý denník — Personal
Edit profile — Personal
Location Logger
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N — Personal
Maďarské voľby – Denník N — Personal
Personal — Mozilla Firefox
Picture-in-Picture
Problem loading page — Personal
Screenpipe Dashboard — Personal
Settings — Personal
Sign in – Google accounts — Personal
Tailscale — Personal
UGREEN NAS — Personal
Vimium Options — Personal
Vimium – Get this Extension for 🦊 Firefox (en-US) — Personal
firefox sidebar - Google Search — Personal
tilscale admin panel - Google Search — Personal
Order Room Service • HBO Max
Shameless • HBO Max
Shameless • HBO Max — Personal
Simple Pleasures • HBO Max — Personal
Časť 2 • HBO Max — Personal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cat ~/.screenpipe/config.json
{
"disable_audio": true,
"monitor_ids": ["Display 1_1440x900_0,0", "Display 2_3008x1253_-813,-1253"],
"ignored_windows": [
"1Password",
"Keychain Access",
"Bitwarden",
"System Preferences",
"System Settings",
"zoom.us",
"HBO Max",
]
}
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ nano ~/.screenpipe/config.json
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe && sleep 2 && npx screenpipe@latest record
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ pkill screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record
detected hardware tier: Mid
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-04-11T19:00:06.546722Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T19:00:07.267955Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T19:00:07.269566Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T19:00:07.269564Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T19:00:07.269921Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T19:00:07.470439Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T19:00:07.470481Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T19:00:07.470420Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T19:00:07.470877Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T19:00:07.471071Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T19:00:07.471748Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T19:00:07.471948Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T19:00:07.472085Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T19:00:07.472295Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T19:00:07.472315Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ soundcore AeroClip (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-04-11T19:00:14.624523Z INFO screenpipe_engine::ui_recorder: UI recording session ended: 6b15bcb7-6588-4b6b-9ae5-5a3b50fba2a2
2026-04-11T19:00:14.624669Z INFO screenpipe: shutdown complete
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ npx screenpipe@latest record
detected hardware tier: Mid
checking permissions...
screen recording: ok
microphone: ok
accessibility: ok
2026-04-11T19:00:31.694964Z INFO screenpipe_screen::monitor::macos_version: Detected macOS version: 14.6
2026-04-11T19:00:32.442217Z INFO screenpipe_engine::sleep_monitor: Starting macOS sleep/wake monitor
2026-04-11T19:00:32.443687Z INFO screenpipe: meeting detector enabled — independent of transcription mode
2026-04-11T19:00:32.443694Z INFO screenpipe_engine::sleep_monitor: Screen lock/unlock observers registered (CFNotificationCenter)
2026-04-11T19:00:32.444120Z INFO screenpipe_engine::sleep_monitor: Display reconfiguration watcher registered (CGDisplayRegisterReconfigurationCallback)
2026-04-11T19:00:32.662907Z INFO screenpipe_engine::snapshot_compaction: snapshot compaction worker started (min_age=600s, poll=300s)
2026-04-11T19:00:32.662887Z INFO screenpipe_engine::power::manager: power manager started (poll interval: 10s)
2026-04-11T19:00:32.662980Z INFO screenpipe_engine::vision_manager::manager: Starting VisionManager
2026-04-11T19:00:32.663355Z INFO screenpipe_core::pipes: loaded pipe: day-recap
2026-04-11T19:00:32.663550Z INFO screenpipe_core::pipes: loaded pipe: standup-update
2026-04-11T19:00:32.664216Z INFO screenpipe_core::pipes: loaded pipe: ai-habits
2026-04-11T19:00:32.664395Z INFO screenpipe_core::pipes: loaded pipe: time-breakdown
2026-04-11T19:00:32.664552Z INFO screenpipe_core::pipes: loaded pipe: video-export
2026-04-11T19:00:32.665488Z INFO screenpipe_core::pipes: loaded pipe: meeting-summary
2026-04-11T19:00:32.665515Z 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 │ [] │
│ included windows │ [] │
│ cloud sync │ disabled │
│ auto-destruct pid │ 0 │
│ deepgram key │ not set │
├────────────────────────┼────────────────────────────────────┤
│ languages │ │
│ │ all languages │
├────────────────────────┼────────────────────────────────────┤
│ monitors │ │
│ │ no monitors available │
├────────────────────────┼────────────────────────────────────┤
│ audio devices │ │
│ │ soundcore AeroClip (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-04-11T19:00:32.667186Z INFO screenpipe_core::pipes: pipe scheduler started (generation 2)
2026-04-11T19:00:32.667286Z INFO screenpipe: starting UI event capture
2026-04-11T19:00:32.670076Z WARN screenpipe: pi agent install failed: bun not found — install from https://bun.sh
2026-04-11T19:00:32.672989Z INFO screenpipe_engine::power::manager: initial power profile: Performance (on_ac=true, battery=Some(100))
2026-04-11T19:00:32.681327Z INFO screenpipe_engine::ui_recorder: Starting UI event capture
2026-04-11T19:00:32.695244Z INFO screenpipe_engine::ui_recorder: UI recording session started: 47668625-ff04-42f8-aa0d-f468ff11f0ff
2026-04-11T19:00:32.695238Z INFO screenpipe_engine::calendar_speaker_id: speaker identification: started (user_name=<not set>)
2026-04-11T19:00:32.695298Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warming from DB (2026-04-10 16:00:32.695296 UTC to 2026-04-11 16:00:32.695296 UTC)
2026-04-11T19:00:32.695769Z INFO screenpipe_engine::meeting_detector: meeting v2: detection loop started (base_interval=5s, profiles=12)
2026-04-11T19:00:32.701263Z INFO screenpipe_engine::server: Server listening on [IP_ADDRESS]:3030
2026-04-11T19:00:32.705041Z INFO screenpipe_connect::mdns: mdns: advertising screenpipe on port 3030
2026-04-11T19:00:32.852998Z INFO screenpipe_engine::hot_frame_cache: hot_frame_cache: warmed with 880 frame entries, coverage from 2026-04-10 16:00:32.695296 UTC
2026-04-11T19:00:32.998691Z INFO screenpipe_engine::vision_manager::manager: Starting vision recording for monitor 1 (1440x900)
2026-04-11T19:00:32.998717Z INFO screenpipe_engine::vision_manager::manager: Starting event-driven capture for monitor 1 (device: monitor_1)
2026-04-11T19:00:32.998728Z INFO screenpipe_engine::vision_manager::manager: Skipping monitor 2 (Display 2_2560x1440_-597,-1440) — not in allowed list
2026-04-11T19:00:32.998739Z INFO screenpipe_engine::vision_manager::monitor_watcher: Starting monitor watcher (polling every 5 seconds)
2026-04-11T19:00:32.998790Z INFO screenpipe_engine::event_driven_capture: event-driven capture started for monitor 1 (device: monitor_1)
2026-04-11T19:00:33.736410Z INFO sck_rs::stream_manager: persistent SCK stream started for display 1 (1440x900, 2fps)
2026-04-11T19:00:34.302357Z INFO screenpipe_engine::event_driven_capture: startup capture for monitor 1: frame_id=1404, dur=507ms
2026-04-11T19:00:37.699366Z INFO screenpipe_engine::retention: retention: initialized with 14d retention
2026-04-11T19:00:37.699830Z INFO screenpipe: local retention auto-enabled (14 days)
DOCKER
Close Tab
DEV (-zsh)
Close Tab...
|
NULL
|
|
1408
|
31
|
1
|
2026-04-11T17:26:09.946632+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928369946_m1.jpg...
|
Firefox
|
Personal — Mozilla Firefox
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Časť 3 DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Časť 3 • HBO Max
Časť 3 • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Close tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
22°
C
New York City
Open menu
Do you want to see the weather for your location?
Do you want to see the weather for your location?
Not now
Not now
Yes
Yes
Mozilla Firefox
Search with Google or enter address
Search with Google or enter address
Inbox - [EMAIL] - Gmail
Inbox - [EMAIL] - Gmail
Open context menu for Inbox - [EMAIL] - Gmail
UGREEN NAS
UGREEN NAS
Open context menu for UGREEN NAS
Časť 2 • HBO Max
Časť 2 • HBO Max
Open context menu for Časť 2 • HBO Max
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Open context menu for Vimium – Get this Extension for 🦊 Firefox (en-US)
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Open context menu for How to use AI-enhanced tab groups | Firefox Help
Screenpipe Dashboard
Screenpipe Dashboard
Open context menu for Screenpipe Dashboard
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Open context menu for Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Wikipedia
Wikipedia
Open context menu for Wikipedia
Customize
Customize...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Časť 3 • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Časť 3 • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":true},{"role":"AXStaticText","text":"New Tab","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"22°","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"C","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"New York City","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Open menu","depth":7,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Do you want to see the weather for your location?","depth":8,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Do you want to see the weather for your location?","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Not now","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Not now","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Yes","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Yes","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Mozilla Firefox","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Search with Google or enter address","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search with Google or enter address","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Inbox - kovaliklukas@gmail.com - Gmail","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"UGREEN NAS","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"UGREEN NAS","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for UGREEN NAS","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Časť 2 • HBO Max","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Časť 2 • HBO Max","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Časť 2 • HBO Max","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"How to use AI-enhanced tab groups | Firefox Help","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for How to use AI-enhanced tab groups | Firefox Help","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Screenpipe Dashboard","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Screenpipe Dashboard","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Wikipedia","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wikipedia","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Wikipedia","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Customize","depth":8,"help_text":"Customize this page","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Customize","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-4711193219250801630
|
-5341263399910241562
|
app_switch
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Časť 3 DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Časť 3 • HBO Max
Časť 3 • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Close tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
22°
C
New York City
Open menu
Do you want to see the weather for your location?
Do you want to see the weather for your location?
Not now
Not now
Yes
Yes
Mozilla Firefox
Search with Google or enter address
Search with Google or enter address
Inbox - [EMAIL] - Gmail
Inbox - [EMAIL] - Gmail
Open context menu for Inbox - [EMAIL] - Gmail
UGREEN NAS
UGREEN NAS
Open context menu for UGREEN NAS
Časť 2 • HBO Max
Časť 2 • HBO Max
Open context menu for Časť 2 • HBO Max
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Open context menu for Vimium – Get this Extension for 🦊 Firefox (en-US)
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Open context menu for How to use AI-enhanced tab groups | Firefox Help
Screenpipe Dashboard
Screenpipe Dashboard
Open context menu for Screenpipe Dashboard
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Open context menu for Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Wikipedia
Wikipedia
Open context menu for Wikipedia
Customize
Customize...
|
NULL
|
|
1410
|
31
|
3
|
2026-04-11T17:26:16.005566+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928376005_m1.jpg...
|
Firefox
|
Personal — Mozilla Firefox
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Close tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
22°
C
New York City
Open menu
Do you want to see the weather for your location?
Do you want to see the weather for your location?
Not now
Not now
Yes
Yes
Mozilla Firefox
Search with Google or enter address
Search with Google or enter address
Inbox - [EMAIL] - Gmail
Inbox - [EMAIL] - Gmail
Open context menu for Inbox - [EMAIL] - Gmail
UGREEN NAS
UGREEN NAS
Open context menu for UGREEN NAS
Časť 2 • HBO Max
Časť 2 • HBO Max
Open context menu for Časť 2 • HBO Max
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Open context menu for Vimium – Get this Extension for 🦊 Firefox (en-US)
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Open context menu for How to use AI-enhanced tab groups | Firefox Help
Screenpipe Dashboard
Screenpipe Dashboard
Open context menu for Screenpipe Dashboard
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Open context menu for Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Wikipedia
Wikipedia
Open context menu for Wikipedia
Customize
Customize...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":true},{"role":"AXStaticText","text":"New Tab","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"22°","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"C","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"New York City","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Open menu","depth":7,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Do you want to see the weather for your location?","depth":8,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Do you want to see the weather for your location?","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Not now","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Not now","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Yes","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Yes","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Mozilla Firefox","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Search with Google or enter address","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search with Google or enter address","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Inbox - kovaliklukas@gmail.com - Gmail","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"UGREEN NAS","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"UGREEN NAS","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for UGREEN NAS","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Časť 2 • HBO Max","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Časť 2 • HBO Max","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Časť 2 • HBO Max","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"How to use AI-enhanced tab groups | Firefox Help","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for How to use AI-enhanced tab groups | Firefox Help","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Screenpipe Dashboard","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Screenpipe Dashboard","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Wikipedia","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wikipedia","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open context menu for Wikipedia","depth":12,"help_text":"Open menu","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Customize","depth":8,"help_text":"Customize this page","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Customize","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-3353597125506565116
|
-5341263399909192986
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Close tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
22°
C
New York City
Open menu
Do you want to see the weather for your location?
Do you want to see the weather for your location?
Not now
Not now
Yes
Yes
Mozilla Firefox
Search with Google or enter address
Search with Google or enter address
Inbox - [EMAIL] - Gmail
Inbox - [EMAIL] - Gmail
Open context menu for Inbox - [EMAIL] - Gmail
UGREEN NAS
UGREEN NAS
Open context menu for UGREEN NAS
Časť 2 • HBO Max
Časť 2 • HBO Max
Open context menu for Časť 2 • HBO Max
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Open context menu for Vimium – Get this Extension for 🦊 Firefox (en-US)
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Open context menu for How to use AI-enhanced tab groups | Firefox Help
Screenpipe Dashboard
Screenpipe Dashboard
Open context menu for Screenpipe Dashboard
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Open context menu for Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Wikipedia
Wikipedia
Open context menu for Wikipedia
Customize
Customize...
|
NULL
|
|
1412
|
31
|
5
|
2026-04-11T17:26:21.343518+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928381343_m1.jpg...
|
Firefox
|
DXP4800PLUS-B5F8 — Personal
|
True
|
nas.lakylak.xyz/desktop/#/
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
1.8
MB/s
54.9
KB/s
Files
Control Panel
Storage
App Center
Logs
Support
Task Manager
Universal Search
Music
Cloud Drives
Theater
Photos
Online Office
TextEdit
Virtual Machine
Downloads
DLNA
File Version Explorer
Security
Jellyfin-HT
SAN Manager
Vault
Snapshot
Comics
Sync & Backup...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1.8","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MB/s","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"54.9","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"KB/s","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Control Panel","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Storage","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"App Center","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Logs","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Support","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Task Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Universal Search","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Music","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Cloud Drives","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Theater","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Photos","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Online Office","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TextEdit","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Virtual Machine","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Downloads","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"DLNA","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File Version Explorer","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Security","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jellyfin-HT","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SAN Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Vault","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Snapshot","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comics","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sync & Backup","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
2814542318795489220
|
-5333628529102943020
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
1.8
MB/s
54.9
KB/s
Files
Control Panel
Storage
App Center
Logs
Support
Task Manager
Universal Search
Music
Cloud Drives
Theater
Photos
Online Office
TextEdit
Virtual Machine
Downloads
DLNA
File Version Explorer
Security
Jellyfin-HT
SAN Manager
Vault
Snapshot
Comics
Sync & Backup...
|
NULL
|
|
1414
|
31
|
7
|
2026-04-11T17:26:23.737658+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928383737_m1.jpg...
|
Firefox
|
DXP4800PLUS-B5F8 — Personal
|
True
|
nas.lakylak.xyz/desktop/#/
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
1.8
MB/s
54.9
KB/s
Files
Control Panel
Storage
App Center
Logs
Support
Task Manager
Universal Search
Music
Cloud Drives
Theater
Photos
Online Office
TextEdit
Virtual Machine
Downloads
DLNA
File Version Explorer
Security
Jellyfin-HT
SAN Manager
Vault
Snapshot
Comics
Sync & Backup
Control Panel
Search...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1.8","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"MB/s","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"54.9","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"KB/s","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Control Panel","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Storage","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"App Center","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Logs","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Support","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Task Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Universal Search","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Music","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Cloud Drives","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Theater","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Photos","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Online Office","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TextEdit","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Virtual Machine","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Downloads","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"DLNA","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File Version Explorer","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Security","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jellyfin-HT","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SAN Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Vault","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Snapshot","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comics","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sync & Backup","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Control Panel","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Search","depth":15}]...
|
-6772885960134454438
|
-5333628528834753324
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
1.8
MB/s
54.9
KB/s
Files
Control Panel
Storage
App Center
Logs
Support
Task Manager
Universal Search
Music
Cloud Drives
Theater
Photos
Online Office
TextEdit
Virtual Machine
Downloads
DLNA
File Version Explorer
Security
Jellyfin-HT
SAN Manager
Vault
Snapshot
Comics
Sync & Backup
Control Panel
Search...
|
NULL
|
|
1416
|
31
|
9
|
2026-04-11T17:26:26.977582+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928386977_m1.jpg...
|
Firefox
|
DXP4800PLUS-B5F8 — Personal
|
True
|
nas.lakylak.xyz/desktop/#/
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
0
B/s
0
B/s
Files
Control Panel
Storage
App Center
Logs
Support
Task Manager
Universal Search
Music
Cloud Drives
Theater
Photos
Online Office
TextEdit
Virtual Machine
Downloads
DLNA
File Version Explorer
Security
Jellyfin-HT
SAN Manager
Vault
Snapshot
Comics
Sync & Backup
Control Panel
Search
Connection & Access
User Management
File Service
Device Connection
Domain/LDAP
Terminal
General
Hardware & Power
Time & Language
Network
Security
Indexing Service
Service
About
Update & Restore
Telnet
Enable
Enable
Port
23
Advanced settings
SSH
Enable
Enable
Port
22
Shut down automatically
3h later
Advanced settings
Function description
Use a terminal to log in and manage your system. When enabling this function, it is recommended to set a strong password for the login account and enable
auto block
auto block
to enhance system security.
Apply
Tips
Tips
SSH possesses advanced remote management feature, but enabling it for a long term will increase security risks (e.g. potential unauthorized access). To ensure NAS and data security, please only enable SSH when in need
Cancel
Enable...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","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":"B/s","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"B/s","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Control Panel","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Storage","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"App Center","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Logs","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Support","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Task Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Universal Search","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Music","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Cloud Drives","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Theater","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Photos","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Online Office","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TextEdit","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Virtual Machine","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Downloads","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"DLNA","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File Version Explorer","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Security","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jellyfin-HT","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SAN Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Vault","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Snapshot","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comics","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sync & Backup","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Control Panel","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Search","depth":15,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Connection & Access","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"User Management","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File Service","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Device Connection","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Domain/LDAP","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Terminal","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"General","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Hardware & Power","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Time & Language","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Network","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Security","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Indexing Service","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Service","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"About","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Update & Restore","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Telnet","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Enable","depth":15,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enable","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Port","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"23","depth":15,"value":"23","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Advanced settings","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SSH","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Enable","depth":15,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enable","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Port","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"22","depth":17,"value":"22","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shut down automatically","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3h later","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Advanced settings","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Function description","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Use a terminal to log in and manage your system. When enabling this function, it is recommended to set a strong password for the login account and enable","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"auto block","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"auto block","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to enhance system security.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Apply","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Tips","depth":18,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tips","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SSH possesses advanced remote management feature, but enabling it for a long term will increase security risks (e.g. potential unauthorized access). To ensure NAS and data security, please only enable SSH when in need","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Cancel","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Enable","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false}]...
|
6910506808265317275
|
-5423704919431001076
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
0
B/s
0
B/s
Files
Control Panel
Storage
App Center
Logs
Support
Task Manager
Universal Search
Music
Cloud Drives
Theater
Photos
Online Office
TextEdit
Virtual Machine
Downloads
DLNA
File Version Explorer
Security
Jellyfin-HT
SAN Manager
Vault
Snapshot
Comics
Sync & Backup
Control Panel
Search
Connection & Access
User Management
File Service
Device Connection
Domain/LDAP
Terminal
General
Hardware & Power
Time & Language
Network
Security
Indexing Service
Service
About
Update & Restore
Telnet
Enable
Enable
Port
23
Advanced settings
SSH
Enable
Enable
Port
22
Shut down automatically
3h later
Advanced settings
Function description
Use a terminal to log in and manage your system. When enabling this function, it is recommended to set a strong password for the login account and enable
auto block
auto block
to enhance system security.
Apply
Tips
Tips
SSH possesses advanced remote management feature, but enabling it for a long term will increase security risks (e.g. potential unauthorized access). To ensure NAS and data security, please only enable SSH when in need
Cancel
Enable...
|
NULL
|
|
1418
|
31
|
11
|
2026-04-11T17:26:29.381047+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928389381_m1.jpg...
|
Firefox
|
DXP4800PLUS-B5F8 — Personal
|
True
|
nas.lakylak.xyz/desktop/#/
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
0
B/s
0
B/s
Files
Control Panel
Storage
App Center
Logs
Support
Task Manager
Universal Search
Music
Cloud Drives
Theater
Photos
Online Office
TextEdit
Virtual Machine
Downloads
DLNA
File Version Explorer
Security
Jellyfin-HT
SAN Manager
Vault
Snapshot
Comics
Sync & Backup
Control Panel
Search
Connection & Access
User Management
File Service
Device Connection
Domain/LDAP
Terminal
General
Hardware & Power
Time & Language
Network
Security
Indexing Service
Service
About
Update & Restore
Telnet
Enable
Enable
Port
23
Advanced settings
SSH
Enable
Enable
Port
22
Shut down automatically
30 min later
Advanced settings
Function description
Use a terminal to log in and manage your system. When enabling this function, it is recommended to set a strong password for the login account and enable
auto block
auto block
to enhance system security....
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","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":"B/s","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"B/s","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Files","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Control Panel","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Storage","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"App Center","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Logs","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Support","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Task Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Universal Search","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Music","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Cloud Drives","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Theater","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Photos","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Online Office","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TextEdit","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Virtual Machine","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Downloads","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"DLNA","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File Version Explorer","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Security","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jellyfin-HT","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SAN Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Vault","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Snapshot","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comics","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sync & Backup","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Control Panel","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Search","depth":15,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Connection & Access","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"User Management","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File Service","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Device Connection","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Domain/LDAP","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Terminal","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"General","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Hardware & Power","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Time & Language","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Network","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Security","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Indexing Service","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Service","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"About","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Update & Restore","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Telnet","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Enable","depth":15,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enable","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Port","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"23","depth":15,"value":"23","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Advanced settings","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SSH","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Enable","depth":15,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enable","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Port","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"22","depth":17,"value":"22","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shut down automatically","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"30 min later","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Advanced settings","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Function description","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Use a terminal to log in and manage your system. When enabling this function, it is recommended to set a strong password for the login account and enable","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"auto block","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"auto block","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to enhance system security.","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8192199784939722003
|
-5428520780364329780
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
0
B/s
0
B/s
Files
Control Panel
Storage
App Center
Logs
Support
Task Manager
Universal Search
Music
Cloud Drives
Theater
Photos
Online Office
TextEdit
Virtual Machine
Downloads
DLNA
File Version Explorer
Security
Jellyfin-HT
SAN Manager
Vault
Snapshot
Comics
Sync & Backup
Control Panel
Search
Connection & Access
User Management
File Service
Device Connection
Domain/LDAP
Terminal
General
Hardware & Power
Time & Language
Network
Security
Indexing Service
Service
About
Update & Restore
Telnet
Enable
Enable
Port
23
Advanced settings
SSH
Enable
Enable
Port
22
Shut down automatically
30 min later
Advanced settings
Function description
Use a terminal to log in and manage your system. When enabling this function, it is recommended to set a strong password for the login account and enable
auto block
auto block
to enhance system security....
|
NULL
|
|
1419
|
31
|
12
|
2026-04-11T17:26:33.558189+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928393558_m1.jpg...
|
Firefox
|
Screenpipe Dashboard — Personal
|
True
|
http://100.73.206.126:8766
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
Generate Report
No AI needed — pure data
📅 SESSION — 2026-04-11
📅 SESSION — 2026-04-11
14:52
START
15:54
END
1.0h
TOTAL SPAN
1.0h
ACTIVE
0.0h
BREAKS (0)
🖥️ APP TIME BY CATEGORY
🖥️ APP TIME BY CATEGORY
💻 code
5.2m total
iTerm2
5.2m
🌐 browser
1.5m total
Firefox
1.5m
🎬 media
0.5m total
QuickTime Player
0.5m
⚙️ system
0.8m total
Finder
0.6m
NetAuthAgent
0.1m
Raycast
0.1m
🌐 WEBSITES BY DOMAIN
🌐 WEBSITES BY DOMAIN
nas.lakylak.xyz/desktop/#/
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5f
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f
0.1m
nas.lakylak.xyz/desktop/#/login/account
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fad
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pri
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii
0.1m
localhost:3030
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/v
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium
0m
accounts.google.com/v3/signin/accountcho
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lm
0m
⌨️ UI ACTIVITY (CLICKS / KEYSTROKES / APP SWITCHES)
⌨️ UI ACTIVITY (CLICKS / KEYSTROKES / APP SWITCHES)
APP
CLICKS
KEYS
SWITCHES
TOTAL
iTerm2
399
200
4
603
Firefox
79
20
4
103
Finder
90
4
5
99
NetAuthAgent
12
0
3
15
APP
iTerm2
Firefox
Finder
NetAuthAgent
CLICKS
399
79
90
12
KEYS
200
20
4
0
SWITCHES
4
4
5
3
TOTAL
603
103
99
15...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe Dashboard","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":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe","depth":7,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"04","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Generate Report","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"No AI needed — pure data","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"📅 SESSION — 2026-04-11","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"📅 SESSION — 2026-04-11","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"START","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15:54","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"END","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TOTAL SPAN","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.0h","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"BREAKS (0)","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🖥️ APP TIME BY CATEGORY","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🖥️ APP TIME BY CATEGORY","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"💻 code","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5.2m total","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"iTerm2","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5.2m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🌐 browser","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.5m total","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.5m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🎬 media","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.5m total","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"QuickTime Player","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.5m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⚙️ system","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.8m total","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finder","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.6m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"NetAuthAgent","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Raycast","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"🌐 WEBSITES BY DOMAIN","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"🌐 WEBSITES BY DOMAIN","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.7m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"play.hbomax.com/video/watch/6b742798-e5f","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/login/account","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/login/account","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"login.tailscale.com/login?next_url=%2Fad","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"login.tailscale.com/login?next_url=%2Fadmin","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"dennikn.sk/5263377/lod-orion-uspesne-pri","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"localhost:3030","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"http://localhost:3030","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"addons.mozilla.org/en-US/firefox/addon/v","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"accounts.google.com/v3/signin/accountcho","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lm","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"⌨️ UI ACTIVITY (CLICKS / KEYSTROKES / APP SWITCHES)","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"⌨️ UI ACTIVITY (CLICKS / KEYSTROKES / APP SWITCHES)","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"APP","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CLICKS","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"KEYS","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SWITCHES","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TOTAL","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"iTerm2","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"399","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"200","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"603","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"79","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"103","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finder","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"90","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"99","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"NetAuthAgent","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"APP","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"iTerm2","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finder","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"NetAuthAgent","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CLICKS","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"399","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"79","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"90","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"KEYS","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"200","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SWITCHES","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TOTAL","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"603","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"103","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"99","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
5066739680521906658
|
3890869682410311260
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
Generate Report
No AI needed — pure data
📅 SESSION — 2026-04-11
📅 SESSION — 2026-04-11
14:52
START
15:54
END
1.0h
TOTAL SPAN
1.0h
ACTIVE
0.0h
BREAKS (0)
🖥️ APP TIME BY CATEGORY
🖥️ APP TIME BY CATEGORY
💻 code
5.2m total
iTerm2
5.2m
🌐 browser
1.5m total
Firefox
1.5m
🎬 media
0.5m total
QuickTime Player
0.5m
⚙️ system
0.8m total
Finder
0.6m
NetAuthAgent
0.1m
Raycast
0.1m
🌐 WEBSITES BY DOMAIN
🌐 WEBSITES BY DOMAIN
nas.lakylak.xyz/desktop/#/
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5f
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f
0.1m
nas.lakylak.xyz/desktop/#/login/account
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fad
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pri
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii
0.1m
localhost:3030
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/v
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium
0m
accounts.google.com/v3/signin/accountcho
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lm
0m
⌨️ UI ACTIVITY (CLICKS / KEYSTROKES / APP SWITCHES)
⌨️ UI ACTIVITY (CLICKS / KEYSTROKES / APP SWITCHES)
APP
CLICKS
KEYS
SWITCHES
TOTAL
iTerm2
399
200
4
603
Firefox
79
20
4
103
Finder
90
4
5
99
NetAuthAgent
12
0
3
15
APP
iTerm2
Firefox
Finder
NetAuthAgent
CLICKS
399
79
90
12
KEYS
200
20
4
0
SWITCHES
4
4
5
3
TOTAL
603
103
99
15...
|
1418
|
|
1421
|
31
|
14
|
2026-04-11T17:26:45.299269+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928405299_m1.jpg...
|
Code
|
#!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73 #!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 8, Col 1
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","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 8, Col 1","depth":16,"bounds":{"left":1.0,"top":0.0,"width":-0.057638884,"height":0.024444444},"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.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":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"}]...
|
5535796483042566297
|
7815794478154879238
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 8, Col 1
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel...
|
1420
|
|
1422
|
31
|
15
|
2026-04-11T17:26:48.246280+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928408246_m1.jpg...
|
Code
|
#!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73 #!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73.206.126]...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
By continuing, you agree to GitHub's
Terms
Ter By continuing, you agree to GitHub's
Terms
Terms
and
Privacy Statement
Privacy Statement
. GitHub Copilot may show
public code
public code
suggestions and use your data to improve the product. You can change these
settings
settings
anytime.
Continue with GitHub
Continue with Google
Continue with Apple
Continue with GHE.com
Sign in to use AI Features...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"By continuing, you agree to GitHub's","depth":12,"role_description":"text"},{"role":"AXLink","text":"Terms","depth":12,"help_text":"https://aka.ms/github-copilot-terms-statement","role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Terms","depth":13,"role_description":"text"},{"role":"AXStaticText","text":"and","depth":12,"role_description":"text"},{"role":"AXLink","text":"Privacy Statement","depth":12,"help_text":"https://aka.ms/github-copilot-privacy-statement","role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Privacy Statement","depth":13,"role_description":"text"},{"role":"AXStaticText","text":". GitHub Copilot may show","depth":12,"role_description":"text"},{"role":"AXLink","text":"public code","depth":12,"help_text":"https://aka.ms/github-copilot-match-public-code","role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"public code","depth":13,"role_description":"text"},{"role":"AXStaticText","text":"suggestions and use your data to improve the product. You can change these","depth":12,"role_description":"text"},{"role":"AXLink","text":"settings","depth":12,"help_text":"https://aka.ms/github-copilot-settings","role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"settings","depth":13,"role_description":"text"},{"role":"AXStaticText","text":"anytime.","depth":12,"role_description":"text"},{"role":"AXButton","text":"Continue with GitHub","depth":9,"role_description":"button","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Continue with Google","depth":9,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Continue with Apple","depth":9,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Continue with GHE.com","depth":9,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"Sign in to use AI Features","depth":10,"role_description":"text"}]...
|
7538711435575432805
|
188903429262323939
|
click
|
accessibility
|
NULL
|
By continuing, you agree to GitHub's
Terms
Ter By continuing, you agree to GitHub's
Terms
Terms
and
Privacy Statement
Privacy Statement
. GitHub Copilot may show
public code
public code
suggestions and use your data to improve the product. You can change these
settings
settings
anytime.
Continue with GitHub
Continue with Google
Continue with Apple
Continue with GHE.com
Sign in to use AI Features...
|
NULL
|
|
1423
|
31
|
16
|
2026-04-11T17:26:54.813894+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928414813_m1.jpg...
|
Code
|
#!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73 #!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"}]...
|
5606118560581161138
|
7851823275173843206
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel...
|
1422
|
|
1425
|
31
|
18
|
2026-04-11T17:27:01.025196+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928421025_m1.jpg...
|
Code
|
Claude Code — screenpipe [SSH: 100.73.206.126]
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Claude Code, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Untitled
Session history
New session
Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.
Prefer the Terminal experience?
Switch back in Settings.
Switch back in Settings.
Close banner
⌘ Esc to focus or unfocus Claude
⌘ Esc to focus or unfocus Claude
Add
Show command menu (/)
Untitled-1
Untitled-1
Edit automatically
Edit automatically...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Untitled","depth":18,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Prefer the Terminal experience?","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"","depth":21,"role_description":"text"},{"role":"AXLink","text":"Switch back in Settings.","depth":21,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Switch back in Settings.","depth":22,"role_description":"text"},{"role":"AXButton","text":"Close banner","depth":20,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"⌘ Esc to focus or unfocus Claude","depth":23,"value":"⌘ Esc to focus or unfocus Claude","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌘ Esc to focus or unfocus Claude","depth":25,"role_description":"text"},{"role":"AXButton","text":"Add","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show command menu (/)","depth":22,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Untitled-1","depth":22,"help_text":"Showing Claude your current file selection (Untitled-1)","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Untitled-1","depth":23,"role_description":"text"},{"role":"AXButton","text":"Edit automatically","depth":23,"help_text":"Claude will edit your selected text or the whole file. Click to change, or press Shift+Tab to cycle.","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Edit automatically","depth":24,"role_description":"text"}]...
|
3808830041804600523
|
3204108459727491334
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Claude Code, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Untitled
Session history
New session
Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.
Prefer the Terminal experience?
Switch back in Settings.
Switch back in Settings.
Close banner
⌘ Esc to focus or unfocus Claude
⌘ Esc to focus or unfocus Claude
Add
Show command menu (/)
Untitled-1
Untitled-1
Edit automatically
Edit automatically...
|
1424
|
|
1427
|
31
|
20
|
2026-04-11T17:27:03.297626+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928423297_m1.jpg...
|
Code
|
Claude Code — screenpipe [SSH: 100.73.206.126]
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Claude Code, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Untitled
Session history
New session
Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.
Prefer the Terminal experience?
Switch back in Settings.
Switch back in Settings.
Close banner
⌘ Esc to focus or unfocus Claude
⌘ Esc to focus or unfocus Claude
Add
Show command menu (/)
Untitled-1
Untitled-1
Edit automatically
Edit automatically...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Untitled","depth":18,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Prefer the Terminal experience?","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"","depth":21,"role_description":"text"},{"role":"AXLink","text":"Switch back in Settings.","depth":21,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Switch back in Settings.","depth":22,"role_description":"text"},{"role":"AXButton","text":"Close banner","depth":20,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"⌘ Esc to focus or unfocus Claude","depth":23,"value":"⌘ Esc to focus or unfocus Claude","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌘ Esc to focus or unfocus Claude","depth":25,"role_description":"text"},{"role":"AXButton","text":"Add","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show command menu (/)","depth":22,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Untitled-1","depth":22,"help_text":"Showing Claude your current file selection (Untitled-1)","role_description":"button","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Untitled-1","depth":23,"role_description":"text"},{"role":"AXButton","text":"Edit automatically","depth":23,"help_text":"Claude will edit your selected text or the whole file. Click to change, or press Shift+Tab to cycle.","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Edit automatically","depth":24,"role_description":"text"}]...
|
3808830041804600523
|
3204108459727491334
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Claude Code, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Untitled
Session history
New session
Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.
Prefer the Terminal experience?
Switch back in Settings.
Switch back in Settings.
Close banner
⌘ Esc to focus or unfocus Claude
⌘ Esc to focus or unfocus Claude
Add
Show command menu (/)
Untitled-1
Untitled-1
Edit automatically
Edit automatically...
|
1426
|
|
1429
|
31
|
22
|
2026-04-11T17:27:06.659773+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928426659_m1.jpg...
|
Code
|
Claude Code — screenpipe [SSH: 100.73.206.126]
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Claude Code, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Untitled
Session history
New session
Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.
Prefer the Terminal experience?
Switch back in Settings.
Switch back in Settings.
Close banner
⌘ Esc to focus or unfocus Claude
⌘ Esc to focus or unfocus Claude
Add
Show command menu (/)
Untitled-1
Untitled-1
Edit automatically
Edit automatically...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Untitled","depth":18,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":18,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Prefer the Terminal experience?","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"","depth":21,"role_description":"text"},{"role":"AXLink","text":"Switch back in Settings.","depth":21,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Switch back in Settings.","depth":22,"role_description":"text"},{"role":"AXButton","text":"Close banner","depth":20,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"⌘ Esc to focus or unfocus Claude","depth":23,"value":"⌘ Esc to focus or unfocus Claude","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌘ Esc to focus or unfocus Claude","depth":25,"role_description":"text"},{"role":"AXButton","text":"Add","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show command menu (/)","depth":22,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Untitled-1","depth":22,"help_text":"Not showing Claude your current file selection (Untitled-1). Click to attach.","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Untitled-1","depth":23,"role_description":"text"},{"role":"AXButton","text":"Edit automatically","depth":23,"help_text":"Claude will edit your selected text or the whole file. Click to change, or press Shift+Tab to cycle.","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Edit automatically","depth":24,"role_description":"text"}]...
|
3808830041804600523
|
3204108459727491334
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Claude Code, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Untitled
Session history
New session
Tired of repeating yourself? Tell Claude to remember what you’ve told it using CLAUDE.md.
Prefer the Terminal experience?
Switch back in Settings.
Switch back in Settings.
Close banner
⌘ Esc to focus or unfocus Claude
⌘ Esc to focus or unfocus Claude
Add
Show command menu (/)
Untitled-1
Untitled-1
Edit automatically
Edit automatically...
|
1428
|
|
1431
|
32
|
0
|
2026-04-11T17:27:18.249125+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928438249_m1.jpg...
|
Firefox
|
Screenpipe Dashboard — Personal
|
True
|
http://100.73.206.126:8766
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
TOTAL SPAN
1.0h
14:52 → 15:54
ACTIVE
1.0h
BREAKS
0 breaks · 0.0h
SESSIONS
1
62m
FRAMES
612
APPS
6
UI EVENTS
1344
AUDIO
0
ACTIVE PERIOD
14:52 → 15:54
TIME PER APP
— CLICK TO FILTER RIGHT PANEL
iTerm2
5.2m
Firefox
1.5m
Finder
0.6m
QuickTime Player
0.5m
NetAuthAgent
0.1m
Raycast
0.1m
Websites
Windows
UI Events
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d
0.1m
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/
0.1m
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
0m
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com
0m...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe Dashboard","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":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe","depth":7,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"04","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"TOTAL SPAN","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52 → 15:54","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"BREAKS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0 breaks · 0.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SESSIONS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"62m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"FRAMES","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"612","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"APPS","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"UI EVENTS","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1344","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AUDIO","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE PERIOD","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52 → 15:54","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TIME PER APP","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"— CLICK TO FILTER RIGHT PANEL","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"iTerm2","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5.2m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.5m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finder","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.6m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"QuickTime Player","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.5m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"NetAuthAgent","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Raycast","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Websites","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Windows","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"UI Events","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.7m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/login/account","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"login.tailscale.com/login?next_url=%2Fadmin","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"http://localhost:3030","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-817909191078697115
|
-5356146286853993268
|
app_switch
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
TOTAL SPAN
1.0h
14:52 → 15:54
ACTIVE
1.0h
BREAKS
0 breaks · 0.0h
SESSIONS
1
62m
FRAMES
612
APPS
6
UI EVENTS
1344
AUDIO
0
ACTIVE PERIOD
14:52 → 15:54
TIME PER APP
— CLICK TO FILTER RIGHT PANEL
iTerm2
5.2m
Firefox
1.5m
Finder
0.6m
QuickTime Player
0.5m
NetAuthAgent
0.1m
Raycast
0.1m
Websites
Windows
UI Events
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d
0.1m
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/
0.1m
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
0m
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com
0m...
|
NULL
|
|
1432
|
32
|
1
|
2026-04-11T17:27:18.683634+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928438683_m1.jpg...
|
Code
|
Build screenpipe data UI… — screenpipe [SSH: 100.7 Build screenpipe data UI… — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null
Copy code to clipboard
OUT
Exit code 1
[rerun: b4]
Bash
Bootstrap pip then install packages
IN
python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10
Copy code to clipboard
OUT
Exit code 1
/usr/bin/python3: No module named ensurepip
[rerun: b5]
Bash
Install pip via apt
IN
apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
OUT
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
[rerun: b6]
Bash
Install pip with sudo
Reason:
lets make it in docker, not to install it in nas directly
IN
sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
Good call. Let me check what Docker setup you already have and build a proper containerized app.
Bash
Check existing docker-compose for reference
IN
ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30
Copy code to clipboard
OUT
consume
data
db
docker-compose.yml
export
mcp-server
media
redis
trash
services:
redis:
image: redis:8
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
security_opt:
- no-new-privileges:true
read_only: true
user: 1000:10
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- /volume2/docker/paperlessngx/redis:/data:rw
environment:
TZ: Europe/Sofia
restart: always
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
[rerun: b7]
Bash
Check Docker availability
IN
docker --version && docker compose version 2>/dev/null
Copy code to clipboard
OUT
Docker version 26.1.0, build 9714adc
Docker Compose version v2.26.1
[rerun: b8]
Bash
Create app directory structure
IN
mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static
Copy code to clipboard
OUT
[rerun: b9]
Now let me build everything. I'll create all the files:
Write
requirements.txt
requirements.txt
6 lines
fastapi==0.115.12
uvicorn[standard]==0.34.0
click==8.1.8
anthropic==0.49.0
python-dotenv==1.1.0
Write
Dockerfile
Dockerfile
13 lines
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "[IP_ADDRESS]", "--port", "8000"]
Write
db.py
db.py
28 lines
import sqlite3
from contextlib import contextmanager
from datetime import date, datetime, timedelta, timezone
from typing import Generator
DB_PATH = "/data/db.sqlite"
@contextmanager
def get_conn() -> Generator[sqlite3.Connection, None, None]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
yield conn
finally:
conn.close()
def date_range(for_date: date) -> tuple[str, str]:
"""Return ISO timestamps for start/end of a given date (UTC)."""
start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)
end = start + timedelta(days=1)
return start.isoformat(), end.isoformat()
def today() -> date:
return datetime.now(timezone.utc).date()
Write
__init__.py
__init__.py
1 line
Write
activity.py
activity.py
123 lines
"""App usage and window focus time consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def app_time(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per app for a given date, sorted descending."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
o.app_name,
COUNT(*) as frame_count,
-- each frame ~ 2s at 0.5fps; convert to minutes
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY o.app_name
ORDER BY frame_count DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per window/tab, optionally filtered by app."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
o.app_name,
o.window_name,
COUNT(*) as frame_count,
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
"""
params: list = [start, end]
if app:
query += " AND o.app_name = ?"
params.append(app)
query += " GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:
"""Return activity bucketed into N-minute intervals."""
d = for_date or _today()
start, end = date_range(d)
interval_sec = interval_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
COUNT(*) as frames
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY bucket, o.app_name
ORDER BY bucket, frames DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def summary_stats(for_date: date | None = None) -> dict[str, Any]:
"""Return high-level stats for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
frames_row = conn.execute(
"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last "
"FROM frames WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
app_count = conn.execute(
"""
SELECT COUNT(DISTINCT o.app_name) as n
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''
""",
(start, end),
).fetchone()
audio_count = conn.execute(
"SELECT COUNT(*) as n FROM audio_transcriptions "
"WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
return {
"date": str(d),
"total_frames": frames_row["n"],
"first_seen": frames_row["first"],
"last_seen": frames_row["last"],
"unique_apps": app_count["n"],
"audio_segments": audio_count["n"],
}
Write
ocr.py
ocr.py
92 lines
"""OCR text search and aggregation consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:
"""Full-text search OCR content."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
f.timestamp,
o.app_name,
o.window_name,
snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet
FROM ocr_text_fts
JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid
JOIN frames f ON o.frame_id = f.id
WHERE ocr_text_fts MATCH ?
AND f.timestamp >= ? AND f.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:
"""Return all OCR text for a date, optionally only focused windows."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
f.timestamp,
o.app_name,
o.window_name,
o.text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
"""
params: list = [start, end]
if focused_only:
query += " AND o.focused = TRUE"
query += " ORDER BY f.timestamp"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:
"""
Return OCR text deduplicated by time chunk + app to reduce LLM token usage.
Groups frames into N-minute buckets and returns one representative text per app per bucket.
"""
d = for_date or _today()
start, end = date_range(d)
interval_sec = chunk_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
o.window_name,
substr(o.text, 1, 500) as text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
GROUP BY bucket, o.app_name
ORDER BY bucket
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
Write
audio.py
audio.py
61 lines
"""Audio transcription consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return all audio transcriptions for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT timestamp, transcription, device, is_input_device, speaker_id
FROM audio_transcriptions
WHERE timestamp >= ? AND timestamp < ?
AND length(transcription) > 2
ORDER BY timestamp
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:
"""Search audio transcriptions."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
a.timestamp,
a.device,
snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet
FROM audio_transcriptions_fts
JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id
WHERE audio_transcriptions_fts MATCH ?
AND a.timestamp >= ? AND a.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def formatted_transcript(for_date: date | None = None) -> str:
"""Return audio as a readable transcript string."""
rows = transcriptions(for_date)
if not rows:
return "(no audio transcriptions)"
lines = []
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
lines.append(f"[{r['timestamp']}] [{label}] {r['transcription']}")
return "\n".join(lines)
Write
summary.py
summary.py
162 lines
"""AI summary generator using Claude."""
import os
from datetime import date
from typing import Any
from consumers.activity import app_time, summary_stats
from consumers.ocr import deduplicated_text
from consumers.audio import formatted_transcript
SUMMARY_TYPES = {
"day_recap": {
"title": "Day Recap",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a concise day recap using EXACTLY this format:
## Summary
One sentence: what I mainly worked on today.
## Accomplishments
- Top 3 things I finished, with approximate times
- Name specific apps, files, or projects
## Key Moments
- Important things seen or heard, with timestamps
## Unfinished Work
- What to continue tomorrow
## Patterns
- Apps used most, topics that came up repeatedly
Only report what you can verify from the data. End with:
**Next step:** [most important thing to continue]""",
},
"standup": {
"title": "Standup Update",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a brief standup update:
**Yesterday:** What I worked on (2-3 bullets)
**Today:** What I plan to continue (1-2 bullets)
**Blockers:** Any issues observed (or "None")
Keep it under 150 words. Only report what's verifiable from the data.""",
},
"focus_time": {
"title": "Focus & Distraction Analysis",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
Analyze focus vs distraction patterns:
## Deep Work Periods
- When and how long were sustained focus sessions?
- What was being worked on?
## Distractions
- Which apps/sites were used recreationally?
- How much time was lost to context switching?
## Recommendations
- 2-3 concrete suggestions to improve focus tomorrow
Be specific with times and app names.""",
},
}
def _build_context(for_date: date) -> dict[str, str]:
apps = app_time(for_date)
app_lines = "\n".join(f"- {a['app_name']}: {a['minutes']} min" for a in apps[:20])
ocr_rows = deduplicated_text(for_date, chunk_minutes=5)
ocr_lines = "\n".join(
f"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}"
for r in ocr_rows[:100]
)
audio = formatted_transcript(for_date)
return {
"app_time": app_lines or "(no app data)",
"ocr_text": ocr_lines or "(no screen data)",
"audio": audio[:3000] if len(audio) > 3000 else audio,
}
def generate(
summary_type: str = "day_recap",
for_date: date | None = None,
api_key: str | None = None,
) -> dict[str, Any]:
"""Generate an AI summary. Returns dict with 'title', 'content', 'date'."""
import anthropic
d = for_date or date.today()
key = api_key or os.environ.get("ANTHROPIC_API_KEY", "")
if not key:
return {
"title": "Error",
"content": "ANTHROPIC_API_KEY not set. Add it to your .env file.",
"date": str(d),
}
spec = SUMMARY_TYPES.get(summary_type)
if not spec:
return {"title": "Error", "content": f"Unknown summary type: {summary_type}", "date": str(d)}
stats = summary_stats(d)
if stats["total_frames"] == 0:
return {
"title": spec["title"],
"content": f"No screen data found for {d}.",
"date": str(d),
}
ctx = _build_context(d)
prompt = spec["prompt"].format(**ctx)
client = anthropic.Anthropic(api_key=key)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return {
"title": spec["title"],
"content": message.content[0].text,
"date": str(d),
"stats": stats,
}
Now the FastAPI backend and CLI:
Write
main.py
main.py
89 lines
"""Screenpipe dashboard — FastAPI web UI."""
import os
from datetime import date, datetime
from typing import Any
from dotenv import load_dotenv
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
load_dotenv()
from consumers.activity import app_time, window_time, timeline, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions, search as audio_search
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
app = FastAPI(title="Screenpipe Dashboard")
app.mount("/static", StaticFiles(directory="static"), name="static")
def _parse_date(d: str | None) -> date | None:
if not d:
return None
try:
return date.fromisoformat(d)
except ValueError:
return None
@app.get("/", response_class=HTMLResponse)
async def index():
with open("static/index.html") as f:
return f.read()
# ── Activity ──────────────────────────────────────────────────────────────────
@app.get("/api/stats")
async def stats(d: str | None = Query(None)):
return summary_stats(_parse_date(d))
@app.get("/api/activity/apps")
async def activity_apps(d: str | None = Query(None)):
return app_time(_parse_date(d))
@app.get("/api/activity/windows")
async def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):
return window_time(_parse_date(d), app_name)
@app.get("/api/activity/timeline")
async def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):
return timeline(_parse_date(d), interval)
# ── Search ───────────────────────────────────────────────────────────────────
@app.get("/api/search/ocr")
async def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):
return ocr_search(q, _parse_date(d), limit)
@app.get("/api/search/audio")
async def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):
return audio_search(q, _parse_date(d), limit)
# ── Audio ─────────────────────────────────────────────────────────────────────
@app.get("/api/audio")
async def audio(d: str | None = Query(None)):
return transcriptions(_parse_date(d))
# ── Summaries ─────────────────────────────────────────────────────────────────
@app.get("/api/summary/types")
async def summary_types():
return [{"id": k, "title": v["title"]} for k, v in SUMMARY_TYPES.items()]
@app.post("/api/summary/generate")
async def generate_summary(type: str = "day_recap", d: str | None = None):
result = gen_summary(type, _parse_date(d))
return result
Write
cli.py
cli.py
131 lines
#!/usr/bin/env python3
"""Screenpipe CLI — run summaries and reports on demand."""
import os
import sys
from datetime import date, timedelta
import click
from dotenv import load_dotenv
load_dotenv()
sys.path.insert(0, os.path.dirname(__file__))
from consumers.activity import app_time, window_time, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
def _resolve_date(d_str: str | None) -> date | None:
if not d_str:
return None
if d_str == "yesterday":
return date.today() - timedelta(days=1)
if d_str == "today":
return date.today()
return date.fromisoformat(d_str)
@click.group()
def cli():
"""Screenpipe data explorer and summariser."""
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--type", "-t", "summary_type", default="day_recap",
type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)
def summary(d, summary_type):
"""Generate an AI summary for a date (default: today)."""
target = _resolve_date(d)
click.echo(f"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...")
result = gen_summary(summary_type, target)
click.echo(f"\n{'─'*60}")
click.echo(f" {result['title']} — {result['date']}")
click.echo(f"{'─'*60}\n")
click.echo(result["content"])
if "stats" in result:
s = result["stats"]
click.echo(f"\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, "
f"{s['audio_segments']} audio segments]")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--app", "-a", default=None, help="Filter by app name")
@click.option("--windows", "-w", is_flag=True, help="Show window breakdown instead of apps")
def activity(d, app, windows):
"""Show time spent per app or window."""
target = _resolve_date(d)
label = str(target or date.today())
if windows or app:
rows = window_time(target, app)
click.echo(f"\nWindow time — {label}" + (f" [{app}]" if app else ""))
click.echo(f"{'App':<25} {'Window':<40} {'Min':>6}")
click.echo("─" * 75)
for r in rows:
click.echo(f"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}")
else:
rows = app_time(target)
stats = summary_stats(target)
click.echo(f"\nApp time — {label}")
click.echo(f"{'App':<30} {'Minutes':>8}")
click.echo("─" * 40)
for r in rows:
click.echo(f"{r['app_name']:<30} {r['minutes']:>8}")
click.echo(f"\nTotal frames: {stats['total_frames']} | "
f"Active: {stats['first_seen']} → {stats['last_seen']}")
@cli.command()
@click.argument("query")
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--audio", is_flag=True, help="Search audio instead of screen text")
@click.option("--limit", "-n", default=20, show_default=True)
def search(query, d, audio, limit):
"""Search OCR screen text or audio transcriptions."""
from consumers.audio import search as audio_search_fn
target = _resolve_date(d)
if audio:
rows = audio_search_fn(query, target, limit)
click.echo(f"\nAudio results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['snippet']}")
else:
rows = ocr_search(query, target, limit)
click.echo(f"\nOCR results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}")
click.echo(f" {r['snippet']}")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
def audio(d):
"""Show audio transcriptions for a date."""
target = _resolve_date(d)
rows = transcriptions(target)
if not rows:
click.echo("No audio transcriptions found.")
return
click.echo(f"\nAudio transcriptions — {target or date.today()}")
click.echo("─" * 60)
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
click.echo(f"[{r['timestamp']}] [{label}] {r['transcription']}")
@cli.command()
def serve():
"""Start the web UI (runs uvicorn on port 8000)."""
import uvicorn
click.echo("Starting Screenpipe dashboard at http://localhost:8000")
uvicorn.run("main:app", host="[IP_ADDRESS]", port=8000, reload=False)
if __name__ == "__main__":
cli()
Now the frontend:
Write...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Build screenpipe data UI…, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Build screenpipe data UI and summary app","depth":18,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"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":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Let me explore the screenpipe directory to understand what we're working with.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List screenpipe directory contents","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"data\ndb.sqlite\npipes\n#recycle\n[rerun: b1]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List data and pipes directories","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09\n2026-04-11\nai-habits\nday-recap\nmeeting-summary\nstandup-update\ntime-breakdown\nvideo-export\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List tables in screenpipe SQLite database","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \".tables\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx\n[rerun: b3]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get ocr_text table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(ocr_text);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|frame_id|INTEGER|1||0\n1|text|TEXT|1||0\n2|text_json|TEXT|0||0\n3|app_name|TEXT|1|''|0\n4|ocr_engine|TEXT|1|'unknown'|0\n5|window_name|TEXT|0||0\n6|focused|BOOLEAN|0|FALSE|0\n7|text_length|INTEGER|0||0\n8|sync_id|TEXT|0||0\n9|synced_at|DATETIME|0||0\n[rerun: b4]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get audio_transcriptions table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(audio_transcriptions);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|audio_chunk_id|INTEGER|1||0\n2|offset_index|INTEGER|1||0\n3|timestamp|TIMESTAMP|1||0\n4|transcription|TEXT|1||0\n5|device|TEXT|1|''|0\n6|is_input_device|BOOLEAN|1|TRUE|0\n7|speaker_id|INTEGER|0||0\n8|transcription_engine|TEXT|1|'Whisper'|0\n9|start_time|REAL|0||0\n10|end_time|REAL|0||0\n11|text_length|INTEGER|0||0\n12|sync_id|TEXT|0||0\n13|synced_at|DATETIME|0||0\n[rerun: b5]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get frames, ui_events, video_chunks schemas","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|video_chunk_id|INTEGER|0|NULL|0\n2|offset_index|INTEGER|1|0|0\n3|timestamp|TIMESTAMP|1||0\n4|name|TEXT|0||0\n5|app_name|TEXT|0|NULL|0\n6|window_name|TEXT|0|NULL|0\n7|focused|BOOLEAN|0|NULL|0\n8|browser_url|TEXT|0|NULL|0\n9|device_name|TEXT|1|''|0\n10|sync_id|TEXT|0||0\n11|machine_id|TEXT|0||0\n12|synced_at|DATETIME|0||0\n13|snapshot_path|TEXT|0|NULL|0\n14|accessibility_text|TEXT|0|NULL|0\n15|accessibility_tree_json|TEXT|0|NULL|0\n16|content_hash|INTEGER|0|NULL|0\n17|simhash|INTEGER|0|NULL|0\n18|capture_trigger|TEXT|0|NULL|0\n19|text_source|TEXT|0|NULL|0\n20|cloud_blob_id|TEXT|0|NULL|0\n21|full_text|TEXT|0|NULL|0\n22|elements_ref_frame_id|INTEGER|0|NULL|0\n0|id|INTEGER|0||1\n1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0\n2|session_id|TEXT|0||0\n3|relative_ms|INTEGER|1|0|0\n4|event_type|TEXT|1||0\n5|x|INTEGER|0||0\n6|y|INTEGER|0||0\n7|delta_x|INTEGER|0||0\n8|delta_y|INTEGER|0||0\n9|button|INTEGER|0||0\n10|click_count|INTEGER|0||0\n11|key_code|INTEGER|0||0\n12|modifiers|INTEGER|0||0\n13|text_content|TEXT|0||0\n14|text_length|INTEGER|0||0\n15|app_name|TEXT|0||0\n16|app_pid|INTEGER|0||0\n17|window_title|TEXT|0||0\n18|browser_url|TEXT|0||0\n19|element_role|TEXT|0||0\n20|element_name|TEXT|0||0\n21|element_value|TEXT|0||0\n22|element_description|TEXT|0||0\n23|element_automation_id|TEXT|0||0\n24|element_bounds|TEXT|0||0\n25|frame_id|INTEGER|0||0\n26|sync_id|TEXT|0||0\n27|machine_id|TEXT|0||0\n28|synced_at|DATETIME|0||0\n0|id|INTEGER|0||1\n1|file_path|TEXT|1||0\n2|device_name|TEXT|1|''|0\n3|sync_id|TEXT|0||0\n4|machine_id|TEXT|0||0\n5|synced_at|DATETIME|0||0\n6|fps|REAL|1|0.5|0\n7|cloud_blob_id|TEXT|0|NULL|0\n[rerun: b6]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check data counts and date ranges","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*) FROM ocr_text;\" 2>/dev/null","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00\n3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00\n666\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Explore existing pipes for patterns","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Read day-recap pipe documentation","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cat /volume1/screenpipe/pipes/day-recap/pipe.md","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"---\nschedule: manual\nenabled: true\ntemplate: true\ntitle: Day Recap\ndescription: \"Today's accomplishments, key moments, and unfinished work\"\nicon: \"📋\"\nfeatured: true\n---\n\nAnalyze my screen and audio recordings from today (last 16 hours only). \n\nRead screenpipe skill first.\n\nUse this exact format:\n\n## Summary\nOne sentence: what I mainly did today.\n\n## Accomplishments\n- Top 3 things I finished, with timestamps (e.g. \"2:30 PM\")\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things I saw, said, or heard — with timestamps\n\n## Unfinished Work\n- What I should continue tomorrow — name the app/file/task\n\n## Patterns\n- Apps I used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with: \"**Next step:** [most important thing to continue]\"\n[rerun: b9]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample app names from frames","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Safari\nActivity Monitor\nDia\niTerm2\nControl Centre\nUserNotificationCenter\nFinder\nClaude\nSlack\nFirefox\nRaycast\nNetAuthAgent\nQuickTime Player\n[rerun: b10]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample joined frame+ocr data for today","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE\n2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER\n2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p\n2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p\n2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample recent audio transcriptions","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09T17:02:52+00:00|.|System Audio\n2026-04-09T16:59:22+00:00|Class is technically...|System Audio\n2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio\n[rerun: b12]","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Good data to work with. Here's what we have:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ocr_text","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Screen captures with OCR text, app name, window name (1135 frames so far)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"audio_transcriptions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Voice/system audio transcripts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ui_events","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Mouse/keyboard events with app context","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Raw video files","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Before I start building, a few quick questions:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Tech stack","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"AI summaries","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"What summaries matter most?","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Day recap (what apps/windows you used, key text seen)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"App time breakdown (time per app)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Audio/conversation recap","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Custom searchable timeline","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Here's the architecture I'm thinking:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"/volume1/screenpipe/app/\n├── main.py # FastAPI web UI\n├── cli.py # Click CLI: `python cli.py day-recap`\n├── db.py # Read-only queries against db.sqlite\n├── consumers/\n│ ├── activity.py # App usage, time per window\n│ ├── ocr.py # OCR text aggregation + search\n│ ├── audio.py # Transcription queries\n│ └── summary.py # AI summary builder\n└── static/\n └── index.html # Single-page UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"CLI commands would look like:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"python cli.py day-recap # EOD summary\npython cli.py activity --date today # App time breakdown\npython cli.py search \"docker\" # Search OCR/audio text\npython cli.py serve # Launch web UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Does this direction work? Any preferences on the stack or which summaries to prioritize?","depth":22,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"seesm ok","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Python and available packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 --version && pip3 list 2>/dev/null | grep -E \"fastapi|uvicorn|click|anthropic|httpx|jinja\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Python 3.11.2\n[rerun: b1]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Verify join works for today's data","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"\nSELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len\nFROM frames f JOIN ocr_text o ON f.id = o.frame_id\nWHERE DATE(f.timestamp) = '2026-04-11'\nORDER BY f.timestamp DESC LIMIT 3;\n\"","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T12:54:42.597794+00:00|||2111\n2026-04-11T12:54:41.915916+00:00|||2110\n2026-04-11T12:54:39.912712+00:00|||2111\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install required packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"/bin/bash: line 1: pip3: command not found\n[rerun: b3]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Find pip","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"which pip || which pip3 || python3 -m pip --version 2>/dev/null","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\n[rerun: b4]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bootstrap pip then install packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\n/usr/bin/python3: No module named ensurepip\n[rerun: b5]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install pip via apt","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"apt-get install -y python3-pip python3-venv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)\nE: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?\n[rerun: b6]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install pip with sudo","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Reason:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"lets make it in docker, not to install it in nas directly","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Good call. Let me check what Docker setup you already have and build a proper containerized app.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check existing docker-compose for reference","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"consume\ndata\ndb\ndocker-compose.yml\nexport\nmcp-server\nmedia\nredis\ntrash\nservices:\n redis:\n image: redis:8\n command:\n - /bin/sh\n - -c\n - redis-server --requirepass redispass\n container_name: PaperlessNGX-REDIS\n hostname: paper-redis\n security_opt:\n - no-new-privileges:true\n read_only: true\n user: 1000:10\n healthcheck:\n test: [\"CMD-SHELL\", \"redis-cli ping || exit 1\"]\n volumes:\n - /volume2/docker/paperlessngx/redis:/data:rw\n environment:\n TZ: Europe/Sofia\n restart: always\n\n db:\n image: postgres:17\n container_name: PaperlessNGX-DB\n hostname: paper-db\n mem_limit: 1g\n security_opt:\n - no-new-privileges:true\n healthcheck:\n test: [\"CMD\", \"pg_isready\", \"-q\", \"-d\", \"paperless\", \"-U\", \"paperlessuser\"]\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Docker availability","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"docker --version && docker compose version 2>/dev/null","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Docker version 26.1.0, build 9714adc\nDocker Compose version v2.26.1\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Create app directory structure","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"[rerun: b9]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Now let me build everything. I'll create all the files:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"requirements.txt","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"requirements.txt","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"6 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"fastapi==0.115.12\nuvicorn[standard]==0.34.0\nclick==8.1.8\nanthropic==0.49.0\npython-dotenv==1.1.0","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"13 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"FROM python:3.12-slim\n\nWORKDIR /app\n\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY . .\n\nEXPOSE 8000\n\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"db.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"db.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"28 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"import sqlite3\nfrom contextlib import contextmanager\nfrom datetime import date, datetime, timedelta, timezone\nfrom typing import Generator\n\nDB_PATH = \"/data/db.sqlite\"\n\n\n@contextmanager\ndef get_conn() -> Generator[sqlite3.Connection, None, None]:\n conn = sqlite3.connect(f\"file:{DB_PATH}?mode=ro\", uri=True)\n conn.row_factory = sqlite3.Row\n try:\n yield conn\n finally:\n conn.close()\n\n\ndef date_range(for_date: date) -> tuple[str, str]:\n \"\"\"Return ISO timestamps for start/end of a given date (UTC).\"\"\"\n start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)\n end = start + timedelta(days=1)\n return start.isoformat(), end.isoformat()\n\n\ndef today() -> date:\n return datetime.now(timezone.utc).date()","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"__init__.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"__init__.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1 line","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"activity.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"activity.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"123 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"App usage and window focus time consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef app_time(for_date: date | None = None) -> list[dict[str, Any]]:\n \"\"\"Return minutes spent per app for a given date, sorted descending.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n o.app_name,\n COUNT(*) as frame_count,\n -- each frame ~ 2s at 0.5fps; convert to minutes\n ROUND(COUNT(*) * 2.0 / 60, 1) as minutes\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n GROUP BY o.app_name\n ORDER BY frame_count DESC\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:\n \"\"\"Return minutes spent per window/tab, optionally filtered by app.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n query = \"\"\"\n SELECT\n o.app_name,\n o.window_name,\n COUNT(*) as frame_count,\n ROUND(COUNT(*) * 2.0 / 60, 1) as minutes\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n \"\"\"\n params: list = [start, end]\n if app:\n query += \" AND o.app_name = ?\"\n params.append(app)\n query += \" GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50\"\n\n with get_conn() as conn:\n rows = conn.execute(query, params).fetchall()\n return [dict(r) for r in rows]\n\n\ndef timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:\n \"\"\"Return activity bucketed into N-minute intervals.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n interval_sec = interval_minutes * 60\n\n with get_conn() as conn:\n rows = conn.execute(\n f\"\"\"\n SELECT\n datetime(\n (strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},\n 'unixepoch'\n ) as bucket,\n o.app_name,\n COUNT(*) as frames\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n GROUP BY bucket, o.app_name\n ORDER BY bucket, frames DESC\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef summary_stats(for_date: date | None = None) -> dict[str, Any]:\n \"\"\"Return high-level stats for a date.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n frames_row = conn.execute(\n \"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last \"\n \"FROM frames WHERE timestamp >= ? AND timestamp < ?\",\n (start, end),\n ).fetchone()\n\n app_count = conn.execute(\n \"\"\"\n SELECT COUNT(DISTINCT o.app_name) as n\n FROM frames f JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''\n \"\"\",\n (start, end),\n ).fetchone()\n\n audio_count = conn.execute(\n \"SELECT COUNT(*) as n FROM audio_transcriptions \"\n \"WHERE timestamp >= ? AND timestamp < ?\",\n (start, end),\n ).fetchone()\n\n return {\n \"date\": str(d),\n \"total_frames\": frames_row[\"n\"],\n \"first_seen\": frames_row[\"first\"],\n \"last_seen\": frames_row[\"last\"],\n \"unique_apps\": app_count[\"n\"],\n \"audio_segments\": audio_count[\"n\"],\n }","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"ocr.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ocr.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"92 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"OCR text search and aggregation consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:\n \"\"\"Full-text search OCR content.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n f.timestamp,\n o.app_name,\n o.window_name,\n snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet\n FROM ocr_text_fts\n JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid\n JOIN frames f ON o.frame_id = f.id\n WHERE ocr_text_fts MATCH ?\n AND f.timestamp >= ? AND f.timestamp < ?\n ORDER BY rank\n LIMIT ?\n \"\"\",\n (query, start, end, limit),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:\n \"\"\"Return all OCR text for a date, optionally only focused windows.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n query = \"\"\"\n SELECT\n f.timestamp,\n o.app_name,\n o.window_name,\n o.text\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n AND length(o.text) > 20\n \"\"\"\n params: list = [start, end]\n if focused_only:\n query += \" AND o.focused = TRUE\"\n query += \" ORDER BY f.timestamp\"\n\n with get_conn() as conn:\n rows = conn.execute(query, params).fetchall()\n return [dict(r) for r in rows]\n\n\ndef deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:\n \"\"\"\n Return OCR text deduplicated by time chunk + app to reduce LLM token usage.\n Groups frames into N-minute buckets and returns one representative text per app per bucket.\n \"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n interval_sec = chunk_minutes * 60\n\n with get_conn() as conn:\n rows = conn.execute(\n f\"\"\"\n SELECT\n datetime(\n (strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},\n 'unixepoch'\n ) as bucket,\n o.app_name,\n o.window_name,\n substr(o.text, 1, 500) as text\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n AND length(o.text) > 20\n GROUP BY bucket, o.app_name\n ORDER BY bucket\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"audio.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"audio.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"61 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"Audio transcription consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:\n \"\"\"Return all audio transcriptions for a date.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT timestamp, transcription, device, is_input_device, speaker_id\n FROM audio_transcriptions\n WHERE timestamp >= ? AND timestamp < ?\n AND length(transcription) > 2\n ORDER BY timestamp\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:\n \"\"\"Search audio transcriptions.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n a.timestamp,\n a.device,\n snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet\n FROM audio_transcriptions_fts\n JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id\n WHERE audio_transcriptions_fts MATCH ?\n AND a.timestamp >= ? AND a.timestamp < ?\n ORDER BY rank\n LIMIT ?\n \"\"\",\n (query, start, end, limit),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef formatted_transcript(for_date: date | None = None) -> str:\n \"\"\"Return audio as a readable transcript string.\"\"\"\n rows = transcriptions(for_date)\n if not rows:\n return \"(no audio transcriptions)\"\n lines = []\n for r in rows:\n label = \"MIC\" if r[\"is_input_device\"] else \"SYS\"\n lines.append(f\"[{r['timestamp']}] [{label}] {r['transcription']}\")\n return \"\\n\".join(lines)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"summary.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"summary.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"162 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"AI summary generator using Claude.\"\"\"\nimport os\nfrom datetime import date\nfrom typing import Any\n\nfrom consumers.activity import app_time, summary_stats\nfrom consumers.ocr import deduplicated_text\nfrom consumers.audio import formatted_transcript\n\n\nSUMMARY_TYPES = {\n \"day_recap\": {\n \"title\": \"Day Recap\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\n## Audio/speech:\n{audio}\n\nWrite a concise day recap using EXACTLY this format:\n\n## Summary\nOne sentence: what I mainly worked on today.\n\n## Accomplishments\n- Top 3 things I finished, with approximate times\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things seen or heard, with timestamps\n\n## Unfinished Work\n- What to continue tomorrow\n\n## Patterns\n- Apps used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with:\n**Next step:** [most important thing to continue]\"\"\",\n },\n \"standup\": {\n \"title\": \"Standup Update\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\n## Audio/speech:\n{audio}\n\nWrite a brief standup update:\n\n**Yesterday:** What I worked on (2-3 bullets)\n**Today:** What I plan to continue (1-2 bullets)\n**Blockers:** Any issues observed (or \"None\")\n\nKeep it under 150 words. Only report what's verifiable from the data.\"\"\",\n },\n \"focus_time\": {\n \"title\": \"Focus & Distraction Analysis\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\nAnalyze focus vs distraction patterns:\n\n## Deep Work Periods\n- When and how long were sustained focus sessions?\n- What was being worked on?\n\n## Distractions\n- Which apps/sites were used recreationally?\n- How much time was lost to context switching?\n\n## Recommendations\n- 2-3 concrete suggestions to improve focus tomorrow\n\nBe specific with times and app names.\"\"\",\n },\n}\n\n\ndef _build_context(for_date: date) -> dict[str, str]:\n apps = app_time(for_date)\n app_lines = \"\\n\".join(f\"- {a['app_name']}: {a['minutes']} min\" for a in apps[:20])\n\n ocr_rows = deduplicated_text(for_date, chunk_minutes=5)\n ocr_lines = \"\\n\".join(\n f\"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}\"\n for r in ocr_rows[:100]\n )\n\n audio = formatted_transcript(for_date)\n\n return {\n \"app_time\": app_lines or \"(no app data)\",\n \"ocr_text\": ocr_lines or \"(no screen data)\",\n \"audio\": audio[:3000] if len(audio) > 3000 else audio,\n }\n\n\ndef generate(\n summary_type: str = \"day_recap\",\n for_date: date | None = None,\n api_key: str | None = None,\n) -> dict[str, Any]:\n \"\"\"Generate an AI summary. Returns dict with 'title', 'content', 'date'.\"\"\"\n import anthropic\n\n d = for_date or date.today()\n key = api_key or os.environ.get(\"ANTHROPIC_API_KEY\", \"\")\n if not key:\n return {\n \"title\": \"Error\",\n \"content\": \"ANTHROPIC_API_KEY not set. Add it to your .env file.\",\n \"date\": str(d),\n }\n\n spec = SUMMARY_TYPES.get(summary_type)\n if not spec:\n return {\"title\": \"Error\", \"content\": f\"Unknown summary type: {summary_type}\", \"date\": str(d)}\n\n stats = summary_stats(d)\n if stats[\"total_frames\"] == 0:\n return {\n \"title\": spec[\"title\"],\n \"content\": f\"No screen data found for {d}.\",\n \"date\": str(d),\n }\n\n ctx = _build_context(d)\n prompt = spec[\"prompt\"].format(**ctx)\n\n client = anthropic.Anthropic(api_key=key)\n message = client.messages.create(\n model=\"claude-opus-4-6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": prompt}],\n )\n\n return {\n \"title\": spec[\"title\"],\n \"content\": message.content[0].text,\n \"date\": str(d),\n \"stats\": stats,\n }","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the FastAPI backend and CLI:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"main.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"89 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"Screenpipe dashboard — FastAPI web UI.\"\"\"\nimport os\nfrom datetime import date, datetime\nfrom typing import Any\n\nfrom dotenv import load_dotenv\nfrom fastapi import FastAPI, Query\nfrom fastapi.responses import HTMLResponse, JSONResponse\nfrom fastapi.staticfiles import StaticFiles\n\nload_dotenv()\n\nfrom consumers.activity import app_time, window_time, timeline, summary_stats\nfrom consumers.ocr import search as ocr_search\nfrom consumers.audio import transcriptions, search as audio_search\nfrom consumers.summary import generate as gen_summary, SUMMARY_TYPES\n\napp = FastAPI(title=\"Screenpipe Dashboard\")\napp.mount(\"/static\", StaticFiles(directory=\"static\"), name=\"static\")\n\n\ndef _parse_date(d: str | None) -> date | None:\n if not d:\n return None\n try:\n return date.fromisoformat(d)\n except ValueError:\n return None\n\n\n@app.get(\"/\", response_class=HTMLResponse)\nasync def index():\n with open(\"static/index.html\") as f:\n return f.read()\n\n\n# ── Activity ──────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/stats\")\nasync def stats(d: str | None = Query(None)):\n return summary_stats(_parse_date(d))\n\n\n@app.get(\"/api/activity/apps\")\nasync def activity_apps(d: str | None = Query(None)):\n return app_time(_parse_date(d))\n\n\n@app.get(\"/api/activity/windows\")\nasync def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):\n return window_time(_parse_date(d), app_name)\n\n\n@app.get(\"/api/activity/timeline\")\nasync def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):\n return timeline(_parse_date(d), interval)\n\n\n# ── Search ───────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/search/ocr\")\nasync def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):\n return ocr_search(q, _parse_date(d), limit)\n\n\n@app.get(\"/api/search/audio\")\nasync def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):\n return audio_search(q, _parse_date(d), limit)\n\n\n# ── Audio ─────────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/audio\")\nasync def audio(d: str | None = Query(None)):\n return transcriptions(_parse_date(d))\n\n\n# ── Summaries ─────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/summary/types\")\nasync def summary_types():\n return [{\"id\": k, \"title\": v[\"title\"]} for k, v in SUMMARY_TYPES.items()]\n\n\n@app.post(\"/api/summary/generate\")\nasync def generate_summary(type: str = \"day_recap\", d: str | None = None):\n result = gen_summary(type, _parse_date(d))\n return result","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"cli.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"cli.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"131 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"#!/usr/bin/env python3\n\"\"\"Screenpipe CLI — run summaries and reports on demand.\"\"\"\nimport os\nimport sys\nfrom datetime import date, timedelta\n\nimport click\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nsys.path.insert(0, os.path.dirname(__file__))\n\nfrom consumers.activity import app_time, window_time, summary_stats\nfrom consumers.ocr import search as ocr_search\nfrom consumers.audio import transcriptions\nfrom consumers.summary import generate as gen_summary, SUMMARY_TYPES\n\n\ndef _resolve_date(d_str: str | None) -> date | None:\n if not d_str:\n return None\n if d_str == \"yesterday\":\n return date.today() - timedelta(days=1)\n if d_str == \"today\":\n return date.today()\n return date.fromisoformat(d_str)\n\n\n@click.group()\ndef cli():\n \"\"\"Screenpipe data explorer and summariser.\"\"\"\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--type\", \"-t\", \"summary_type\", default=\"day_recap\",\n type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)\ndef summary(d, summary_type):\n \"\"\"Generate an AI summary for a date (default: today).\"\"\"\n target = _resolve_date(d)\n click.echo(f\"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...\")\n result = gen_summary(summary_type, target)\n click.echo(f\"\\n{'─'*60}\")\n click.echo(f\" {result['title']} — {result['date']}\")\n click.echo(f\"{'─'*60}\\n\")\n click.echo(result[\"content\"])\n if \"stats\" in result:\n s = result[\"stats\"]\n click.echo(f\"\\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, \"\n f\"{s['audio_segments']} audio segments]\")\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--app\", \"-a\", default=None, help=\"Filter by app name\")\n@click.option(\"--windows\", \"-w\", is_flag=True, help=\"Show window breakdown instead of apps\")\ndef activity(d, app, windows):\n \"\"\"Show time spent per app or window.\"\"\"\n target = _resolve_date(d)\n label = str(target or date.today())\n\n if windows or app:\n rows = window_time(target, app)\n click.echo(f\"\\nWindow time — {label}\" + (f\" [{app}]\" if app else \"\"))\n click.echo(f\"{'App':<25} {'Window':<40} {'Min':>6}\")\n click.echo(\"─\" * 75)\n for r in rows:\n click.echo(f\"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}\")\n else:\n rows = app_time(target)\n stats = summary_stats(target)\n click.echo(f\"\\nApp time — {label}\")\n click.echo(f\"{'App':<30} {'Minutes':>8}\")\n click.echo(\"─\" * 40)\n for r in rows:\n click.echo(f\"{r['app_name']:<30} {r['minutes']:>8}\")\n click.echo(f\"\\nTotal frames: {stats['total_frames']} | \"\n f\"Active: {stats['first_seen']} → {stats['last_seen']}\")\n\n\n@cli.command()\n@click.argument(\"query\")\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--audio\", is_flag=True, help=\"Search audio instead of screen text\")\n@click.option(\"--limit\", \"-n\", default=20, show_default=True)\ndef search(query, d, audio, limit):\n \"\"\"Search OCR screen text or audio transcriptions.\"\"\"\n from consumers.audio import search as audio_search_fn\n\n target = _resolve_date(d)\n if audio:\n rows = audio_search_fn(query, target, limit)\n click.echo(f\"\\nAudio results for '{query}':\")\n for r in rows:\n click.echo(f\" [{r['timestamp']}] {r['snippet']}\")\n else:\n rows = ocr_search(query, target, limit)\n click.echo(f\"\\nOCR results for '{query}':\")\n for r in rows:\n click.echo(f\" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}\")\n click.echo(f\" {r['snippet']}\")\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\ndef audio(d):\n \"\"\"Show audio transcriptions for a date.\"\"\"\n target = _resolve_date(d)\n rows = transcriptions(target)\n if not rows:\n click.echo(\"No audio transcriptions found.\")\n return\n click.echo(f\"\\nAudio transcriptions — {target or date.today()}\")\n click.echo(\"─\" * 60)\n for r in rows:\n label = \"MIC\" if r[\"is_input_device\"] else \"SYS\"\n click.echo(f\"[{r['timestamp']}] [{label}] {r['transcription']}\")\n\n\n@cli.command()\ndef serve():\n \"\"\"Start the web UI (runs uvicorn on port 8000).\"\"\"\n import uvicorn\n click.echo(\"Starting Screenpipe dashboard at http://localhost:8000\")\n uvicorn.run(\"main:app\", host=\"0.0.0.0\", port=8000, reload=False)\n\n\nif __name__ == \"__main__\":\n cli()","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the frontend:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"}]...
|
9119589316943796240
|
-8191624847160147962
|
app_switch
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null
Copy code to clipboard
OUT
Exit code 1
[rerun: b4]
Bash
Bootstrap pip then install packages
IN
python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10
Copy code to clipboard
OUT
Exit code 1
/usr/bin/python3: No module named ensurepip
[rerun: b5]
Bash
Install pip via apt
IN
apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
OUT
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
[rerun: b6]
Bash
Install pip with sudo
Reason:
lets make it in docker, not to install it in nas directly
IN
sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
Good call. Let me check what Docker setup you already have and build a proper containerized app.
Bash
Check existing docker-compose for reference
IN
ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30
Copy code to clipboard
OUT
consume
data
db
docker-compose.yml
export
mcp-server
media
redis
trash
services:
redis:
image: redis:8
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
security_opt:
- no-new-privileges:true
read_only: true
user: 1000:10
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- /volume2/docker/paperlessngx/redis:/data:rw
environment:
TZ: Europe/Sofia
restart: always
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
[rerun: b7]
Bash
Check Docker availability
IN
docker --version && docker compose version 2>/dev/null
Copy code to clipboard
OUT
Docker version 26.1.0, build 9714adc
Docker Compose version v2.26.1
[rerun: b8]
Bash
Create app directory structure
IN
mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static
Copy code to clipboard
OUT
[rerun: b9]
Now let me build everything. I'll create all the files:
Write
requirements.txt
requirements.txt
6 lines
fastapi==0.115.12
uvicorn[standard]==0.34.0
click==8.1.8
anthropic==0.49.0
python-dotenv==1.1.0
Write
Dockerfile
Dockerfile
13 lines
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "[IP_ADDRESS]", "--port", "8000"]
Write
db.py
db.py
28 lines
import sqlite3
from contextlib import contextmanager
from datetime import date, datetime, timedelta, timezone
from typing import Generator
DB_PATH = "/data/db.sqlite"
@contextmanager
def get_conn() -> Generator[sqlite3.Connection, None, None]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
yield conn
finally:
conn.close()
def date_range(for_date: date) -> tuple[str, str]:
"""Return ISO timestamps for start/end of a given date (UTC)."""
start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)
end = start + timedelta(days=1)
return start.isoformat(), end.isoformat()
def today() -> date:
return datetime.now(timezone.utc).date()
Write
__init__.py
__init__.py
1 line
Write
activity.py
activity.py
123 lines
"""App usage and window focus time consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def app_time(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per app for a given date, sorted descending."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
o.app_name,
COUNT(*) as frame_count,
-- each frame ~ 2s at 0.5fps; convert to minutes
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY o.app_name
ORDER BY frame_count DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per window/tab, optionally filtered by app."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
o.app_name,
o.window_name,
COUNT(*) as frame_count,
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
"""
params: list = [start, end]
if app:
query += " AND o.app_name = ?"
params.append(app)
query += " GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:
"""Return activity bucketed into N-minute intervals."""
d = for_date or _today()
start, end = date_range(d)
interval_sec = interval_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
COUNT(*) as frames
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY bucket, o.app_name
ORDER BY bucket, frames DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def summary_stats(for_date: date | None = None) -> dict[str, Any]:
"""Return high-level stats for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
frames_row = conn.execute(
"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last "
"FROM frames WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
app_count = conn.execute(
"""
SELECT COUNT(DISTINCT o.app_name) as n
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''
""",
(start, end),
).fetchone()
audio_count = conn.execute(
"SELECT COUNT(*) as n FROM audio_transcriptions "
"WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
return {
"date": str(d),
"total_frames": frames_row["n"],
"first_seen": frames_row["first"],
"last_seen": frames_row["last"],
"unique_apps": app_count["n"],
"audio_segments": audio_count["n"],
}
Write
ocr.py
ocr.py
92 lines
"""OCR text search and aggregation consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:
"""Full-text search OCR content."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
f.timestamp,
o.app_name,
o.window_name,
snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet
FROM ocr_text_fts
JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid
JOIN frames f ON o.frame_id = f.id
WHERE ocr_text_fts MATCH ?
AND f.timestamp >= ? AND f.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:
"""Return all OCR text for a date, optionally only focused windows."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
f.timestamp,
o.app_name,
o.window_name,
o.text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
"""
params: list = [start, end]
if focused_only:
query += " AND o.focused = TRUE"
query += " ORDER BY f.timestamp"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:
"""
Return OCR text deduplicated by time chunk + app to reduce LLM token usage.
Groups frames into N-minute buckets and returns one representative text per app per bucket.
"""
d = for_date or _today()
start, end = date_range(d)
interval_sec = chunk_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
o.window_name,
substr(o.text, 1, 500) as text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
GROUP BY bucket, o.app_name
ORDER BY bucket
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
Write
audio.py
audio.py
61 lines
"""Audio transcription consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return all audio transcriptions for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT timestamp, transcription, device, is_input_device, speaker_id
FROM audio_transcriptions
WHERE timestamp >= ? AND timestamp < ?
AND length(transcription) > 2
ORDER BY timestamp
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:
"""Search audio transcriptions."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
a.timestamp,
a.device,
snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet
FROM audio_transcriptions_fts
JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id
WHERE audio_transcriptions_fts MATCH ?
AND a.timestamp >= ? AND a.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def formatted_transcript(for_date: date | None = None) -> str:
"""Return audio as a readable transcript string."""
rows = transcriptions(for_date)
if not rows:
return "(no audio transcriptions)"
lines = []
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
lines.append(f"[{r['timestamp']}] [{label}] {r['transcription']}")
return "\n".join(lines)
Write
summary.py
summary.py
162 lines
"""AI summary generator using Claude."""
import os
from datetime import date
from typing import Any
from consumers.activity import app_time, summary_stats
from consumers.ocr import deduplicated_text
from consumers.audio import formatted_transcript
SUMMARY_TYPES = {
"day_recap": {
"title": "Day Recap",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a concise day recap using EXACTLY this format:
## Summary
One sentence: what I mainly worked on today.
## Accomplishments
- Top 3 things I finished, with approximate times
- Name specific apps, files, or projects
## Key Moments
- Important things seen or heard, with timestamps
## Unfinished Work
- What to continue tomorrow
## Patterns
- Apps used most, topics that came up repeatedly
Only report what you can verify from the data. End with:
**Next step:** [most important thing to continue]""",
},
"standup": {
"title": "Standup Update",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a brief standup update:
**Yesterday:** What I worked on (2-3 bullets)
**Today:** What I plan to continue (1-2 bullets)
**Blockers:** Any issues observed (or "None")
Keep it under 150 words. Only report what's verifiable from the data.""",
},
"focus_time": {
"title": "Focus & Distraction Analysis",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
Analyze focus vs distraction patterns:
## Deep Work Periods
- When and how long were sustained focus sessions?
- What was being worked on?
## Distractions
- Which apps/sites were used recreationally?
- How much time was lost to context switching?
## Recommendations
- 2-3 concrete suggestions to improve focus tomorrow
Be specific with times and app names.""",
},
}
def _build_context(for_date: date) -> dict[str, str]:
apps = app_time(for_date)
app_lines = "\n".join(f"- {a['app_name']}: {a['minutes']} min" for a in apps[:20])
ocr_rows = deduplicated_text(for_date, chunk_minutes=5)
ocr_lines = "\n".join(
f"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}"
for r in ocr_rows[:100]
)
audio = formatted_transcript(for_date)
return {
"app_time": app_lines or "(no app data)",
"ocr_text": ocr_lines or "(no screen data)",
"audio": audio[:3000] if len(audio) > 3000 else audio,
}
def generate(
summary_type: str = "day_recap",
for_date: date | None = None,
api_key: str | None = None,
) -> dict[str, Any]:
"""Generate an AI summary. Returns dict with 'title', 'content', 'date'."""
import anthropic
d = for_date or date.today()
key = api_key or os.environ.get("ANTHROPIC_API_KEY", "")
if not key:
return {
"title": "Error",
"content": "ANTHROPIC_API_KEY not set. Add it to your .env file.",
"date": str(d),
}
spec = SUMMARY_TYPES.get(summary_type)
if not spec:
return {"title": "Error", "content": f"Unknown summary type: {summary_type}", "date": str(d)}
stats = summary_stats(d)
if stats["total_frames"] == 0:
return {
"title": spec["title"],
"content": f"No screen data found for {d}.",
"date": str(d),
}
ctx = _build_context(d)
prompt = spec["prompt"].format(**ctx)
client = anthropic.Anthropic(api_key=key)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return {
"title": spec["title"],
"content": message.content[0].text,
"date": str(d),
"stats": stats,
}
Now the FastAPI backend and CLI:
Write
main.py
main.py
89 lines
"""Screenpipe dashboard — FastAPI web UI."""
import os
from datetime import date, datetime
from typing import Any
from dotenv import load_dotenv
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
load_dotenv()
from consumers.activity import app_time, window_time, timeline, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions, search as audio_search
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
app = FastAPI(title="Screenpipe Dashboard")
app.mount("/static", StaticFiles(directory="static"), name="static")
def _parse_date(d: str | None) -> date | None:
if not d:
return None
try:
return date.fromisoformat(d)
except ValueError:
return None
@app.get("/", response_class=HTMLResponse)
async def index():
with open("static/index.html") as f:
return f.read()
# ── Activity ──────────────────────────────────────────────────────────────────
@app.get("/api/stats")
async def stats(d: str | None = Query(None)):
return summary_stats(_parse_date(d))
@app.get("/api/activity/apps")
async def activity_apps(d: str | None = Query(None)):
return app_time(_parse_date(d))
@app.get("/api/activity/windows")
async def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):
return window_time(_parse_date(d), app_name)
@app.get("/api/activity/timeline")
async def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):
return timeline(_parse_date(d), interval)
# ── Search ───────────────────────────────────────────────────────────────────
@app.get("/api/search/ocr")
async def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):
return ocr_search(q, _parse_date(d), limit)
@app.get("/api/search/audio")
async def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):
return audio_search(q, _parse_date(d), limit)
# ── Audio ─────────────────────────────────────────────────────────────────────
@app.get("/api/audio")
async def audio(d: str | None = Query(None)):
return transcriptions(_parse_date(d))
# ── Summaries ─────────────────────────────────────────────────────────────────
@app.get("/api/summary/types")
async def summary_types():
return [{"id": k, "title": v["title"]} for k, v in SUMMARY_TYPES.items()]
@app.post("/api/summary/generate")
async def generate_summary(type: str = "day_recap", d: str | None = None):
result = gen_summary(type, _parse_date(d))
return result
Write
cli.py
cli.py
131 lines
#!/usr/bin/env python3
"""Screenpipe CLI — run summaries and reports on demand."""
import os
import sys
from datetime import date, timedelta
import click
from dotenv import load_dotenv
load_dotenv()
sys.path.insert(0, os.path.dirname(__file__))
from consumers.activity import app_time, window_time, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
def _resolve_date(d_str: str | None) -> date | None:
if not d_str:
return None
if d_str == "yesterday":
return date.today() - timedelta(days=1)
if d_str == "today":
return date.today()
return date.fromisoformat(d_str)
@click.group()
def cli():
"""Screenpipe data explorer and summariser."""
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--type", "-t", "summary_type", default="day_recap",
type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)
def summary(d, summary_type):
"""Generate an AI summary for a date (default: today)."""
target = _resolve_date(d)
click.echo(f"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...")
result = gen_summary(summary_type, target)
click.echo(f"\n{'─'*60}")
click.echo(f" {result['title']} — {result['date']}")
click.echo(f"{'─'*60}\n")
click.echo(result["content"])
if "stats" in result:
s = result["stats"]
click.echo(f"\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, "
f"{s['audio_segments']} audio segments]")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--app", "-a", default=None, help="Filter by app name")
@click.option("--windows", "-w", is_flag=True, help="Show window breakdown instead of apps")
def activity(d, app, windows):
"""Show time spent per app or window."""
target = _resolve_date(d)
label = str(target or date.today())
if windows or app:
rows = window_time(target, app)
click.echo(f"\nWindow time — {label}" + (f" [{app}]" if app else ""))
click.echo(f"{'App':<25} {'Window':<40} {'Min':>6}")
click.echo("─" * 75)
for r in rows:
click.echo(f"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}")
else:
rows = app_time(target)
stats = summary_stats(target)
click.echo(f"\nApp time — {label}")
click.echo(f"{'App':<30} {'Minutes':>8}")
click.echo("─" * 40)
for r in rows:
click.echo(f"{r['app_name']:<30} {r['minutes']:>8}")
click.echo(f"\nTotal frames: {stats['total_frames']} | "
f"Active: {stats['first_seen']} → {stats['last_seen']}")
@cli.command()
@click.argument("query")
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--audio", is_flag=True, help="Search audio instead of screen text")
@click.option("--limit", "-n", default=20, show_default=True)
def search(query, d, audio, limit):
"""Search OCR screen text or audio transcriptions."""
from consumers.audio import search as audio_search_fn
target = _resolve_date(d)
if audio:
rows = audio_search_fn(query, target, limit)
click.echo(f"\nAudio results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['snippet']}")
else:
rows = ocr_search(query, target, limit)
click.echo(f"\nOCR results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}")
click.echo(f" {r['snippet']}")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
def audio(d):
"""Show audio transcriptions for a date."""
target = _resolve_date(d)
rows = transcriptions(target)
if not rows:
click.echo("No audio transcriptions found.")
return
click.echo(f"\nAudio transcriptions — {target or date.today()}")
click.echo("─" * 60)
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
click.echo(f"[{r['timestamp']}] [{label}] {r['transcription']}")
@cli.command()
def serve():
"""Start the web UI (runs uvicorn on port 8000)."""
import uvicorn
click.echo("Starting Screenpipe dashboard at http://localhost:8000")
uvicorn.run("main:app", host="[IP_ADDRESS]", port=8000, reload=False)
if __name__ == "__main__":
cli()
Now the frontend:
Write...
|
NULL
|
|
1434
|
32
|
3
|
2026-04-11T17:27:49.864864+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928469864_m1.jpg...
|
Code
|
Build screenpipe data UI… — screenpipe [SSH: 100.7 Build screenpipe data UI… — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null
Copy code to clipboard
OUT
Exit code 1
[rerun: b4]
Bash
Bootstrap pip then install packages
IN
python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10
Copy code to clipboard
OUT
Exit code 1
/usr/bin/python3: No module named ensurepip
[rerun: b5]
Bash
Install pip via apt
IN
apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
OUT
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
[rerun: b6]
Bash
Install pip with sudo
Reason:
lets make it in docker, not to install it in nas directly
IN
sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
Good call. Let me check what Docker setup you already have and build a proper containerized app.
Bash
Check existing docker-compose for reference
IN
ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30
Copy code to clipboard
OUT
consume
data
db
docker-compose.yml
export
mcp-server
media
redis
trash
services:
redis:
image: redis:8
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
security_opt:
- no-new-privileges:true
read_only: true
user: 1000:10
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- /volume2/docker/paperlessngx/redis:/data:rw
environment:
TZ: Europe/Sofia
restart: always
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
[rerun: b7]
Bash
Check Docker availability
IN
docker --version && docker compose version 2>/dev/null
Copy code to clipboard
OUT
Docker version 26.1.0, build 9714adc
Docker Compose version v2.26.1
[rerun: b8]
Bash
Create app directory structure
IN
mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static
Copy code to clipboard
OUT
[rerun: b9]
Now let me build everything. I'll create all the files:
Write
requirements.txt
requirements.txt
6 lines
fastapi==0.115.12
uvicorn[standard]==0.34.0
click==8.1.8
anthropic==0.49.0
python-dotenv==1.1.0
Write
Dockerfile
Dockerfile
13 lines
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "[IP_ADDRESS]", "--port", "8000"]
Write
db.py
db.py
28 lines
import sqlite3
from contextlib import contextmanager
from datetime import date, datetime, timedelta, timezone
from typing import Generator
DB_PATH = "/data/db.sqlite"
@contextmanager
def get_conn() -> Generator[sqlite3.Connection, None, None]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
yield conn
finally:
conn.close()
def date_range(for_date: date) -> tuple[str, str]:
"""Return ISO timestamps for start/end of a given date (UTC)."""
start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)
end = start + timedelta(days=1)
return start.isoformat(), end.isoformat()
def today() -> date:
return datetime.now(timezone.utc).date()
Write
__init__.py
__init__.py
1 line
Write
activity.py
activity.py
123 lines
"""App usage and window focus time consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def app_time(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per app for a given date, sorted descending."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
o.app_name,
COUNT(*) as frame_count,
-- each frame ~ 2s at 0.5fps; convert to minutes
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY o.app_name
ORDER BY frame_count DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per window/tab, optionally filtered by app."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
o.app_name,
o.window_name,
COUNT(*) as frame_count,
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
"""
params: list = [start, end]
if app:
query += " AND o.app_name = ?"
params.append(app)
query += " GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:
"""Return activity bucketed into N-minute intervals."""
d = for_date or _today()
start, end = date_range(d)
interval_sec = interval_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
COUNT(*) as frames
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY bucket, o.app_name
ORDER BY bucket, frames DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def summary_stats(for_date: date | None = None) -> dict[str, Any]:
"""Return high-level stats for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
frames_row = conn.execute(
"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last "
"FROM frames WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
app_count = conn.execute(
"""
SELECT COUNT(DISTINCT o.app_name) as n
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''
""",
(start, end),
).fetchone()
audio_count = conn.execute(
"SELECT COUNT(*) as n FROM audio_transcriptions "
"WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
return {
"date": str(d),
"total_frames": frames_row["n"],
"first_seen": frames_row["first"],
"last_seen": frames_row["last"],
"unique_apps": app_count["n"],
"audio_segments": audio_count["n"],
}
Write
ocr.py
ocr.py
92 lines
"""OCR text search and aggregation consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:
"""Full-text search OCR content."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
f.timestamp,
o.app_name,
o.window_name,
snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet
FROM ocr_text_fts
JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid
JOIN frames f ON o.frame_id = f.id
WHERE ocr_text_fts MATCH ?
AND f.timestamp >= ? AND f.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:
"""Return all OCR text for a date, optionally only focused windows."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
f.timestamp,
o.app_name,
o.window_name,
o.text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
"""
params: list = [start, end]
if focused_only:
query += " AND o.focused = TRUE"
query += " ORDER BY f.timestamp"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:
"""
Return OCR text deduplicated by time chunk + app to reduce LLM token usage.
Groups frames into N-minute buckets and returns one representative text per app per bucket.
"""
d = for_date or _today()
start, end = date_range(d)
interval_sec = chunk_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
o.window_name,
substr(o.text, 1, 500) as text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
GROUP BY bucket, o.app_name
ORDER BY bucket
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
Write
audio.py
audio.py
61 lines
"""Audio transcription consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return all audio transcriptions for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT timestamp, transcription, device, is_input_device, speaker_id
FROM audio_transcriptions
WHERE timestamp >= ? AND timestamp < ?
AND length(transcription) > 2
ORDER BY timestamp
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:
"""Search audio transcriptions."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
a.timestamp,
a.device,
snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet
FROM audio_transcriptions_fts
JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id
WHERE audio_transcriptions_fts MATCH ?
AND a.timestamp >= ? AND a.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def formatted_transcript(for_date: date | None = None) -> str:
"""Return audio as a readable transcript string."""
rows = transcriptions(for_date)
if not rows:
return "(no audio transcriptions)"
lines = []
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
lines.append(f"[{r['timestamp']}] [{label}] {r['transcription']}")
return "\n".join(lines)
Write
summary.py
summary.py
162 lines
"""AI summary generator using Claude."""
import os
from datetime import date
from typing import Any
from consumers.activity import app_time, summary_stats
from consumers.ocr import deduplicated_text
from consumers.audio import formatted_transcript
SUMMARY_TYPES = {
"day_recap": {
"title": "Day Recap",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a concise day recap using EXACTLY this format:
## Summary
One sentence: what I mainly worked on today.
## Accomplishments
- Top 3 things I finished, with approximate times
- Name specific apps, files, or projects
## Key Moments
- Important things seen or heard, with timestamps
## Unfinished Work
- What to continue tomorrow
## Patterns
- Apps used most, topics that came up repeatedly
Only report what you can verify from the data. End with:
**Next step:** [most important thing to continue]""",
},
"standup": {
"title": "Standup Update",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a brief standup update:
**Yesterday:** What I worked on (2-3 bullets)
**Today:** What I plan to continue (1-2 bullets)
**Blockers:** Any issues observed (or "None")
Keep it under 150 words. Only report what's verifiable from the data.""",
},
"focus_time": {
"title": "Focus & Distraction Analysis",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
Analyze focus vs distraction patterns:
## Deep Work Periods
- When and how long were sustained focus sessions?
- What was being worked on?
## Distractions
- Which apps/sites were used recreationally?
- How much time was lost to context switching?
## Recommendations
- 2-3 concrete suggestions to improve focus tomorrow
Be specific with times and app names.""",
},
}
def _build_context(for_date: date) -> dict[str, str]:
apps = app_time(for_date)
app_lines = "\n".join(f"- {a['app_name']}: {a['minutes']} min" for a in apps[:20])
ocr_rows = deduplicated_text(for_date, chunk_minutes=5)
ocr_lines = "\n".join(
f"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}"
for r in ocr_rows[:100]
)
audio = formatted_transcript(for_date)
return {
"app_time": app_lines or "(no app data)",
"ocr_text": ocr_lines or "(no screen data)",
"audio": audio[:3000] if len(audio) > 3000 else audio,
}
def generate(
summary_type: str = "day_recap",
for_date: date | None = None,
api_key: str | None = None,
) -> dict[str, Any]:
"""Generate an AI summary. Returns dict with 'title', 'content', 'date'."""
import anthropic
d = for_date or date.today()
key = api_key or os.environ.get("ANTHROPIC_API_KEY", "")
if not key:
return {
"title": "Error",
"content": "ANTHROPIC_API_KEY not set. Add it to your .env file.",
"date": str(d),
}
spec = SUMMARY_TYPES.get(summary_type)
if not spec:
return {"title": "Error", "content": f"Unknown summary type: {summary_type}", "date": str(d)}
stats = summary_stats(d)
if stats["total_frames"] == 0:
return {
"title": spec["title"],
"content": f"No screen data found for {d}.",
"date": str(d),
}
ctx = _build_context(d)
prompt = spec["prompt"].format(**ctx)
client = anthropic.Anthropic(api_key=key)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return {
"title": spec["title"],
"content": message.content[0].text,
"date": str(d),
"stats": stats,
}
Now the FastAPI backend and CLI:
Write
main.py
main.py
89 lines
"""Screenpipe dashboard — FastAPI web UI."""
import os
from datetime import date, datetime
from typing import Any
from dotenv import load_dotenv
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
load_dotenv()
from consumers.activity import app_time, window_time, timeline, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions, search as audio_search
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
app = FastAPI(title="Screenpipe Dashboard")
app.mount("/static", StaticFiles(directory="static"), name="static")
def _parse_date(d: str | None) -> date | None:
if not d:
return None
try:
return date.fromisoformat(d)
except ValueError:
return None
@app.get("/", response_class=HTMLResponse)
async def index():
with open("static/index.html") as f:
return f.read()
# ── Activity ──────────────────────────────────────────────────────────────────
@app.get("/api/stats")
async def stats(d: str | None = Query(None)):
return summary_stats(_parse_date(d))
@app.get("/api/activity/apps")
async def activity_apps(d: str | None = Query(None)):
return app_time(_parse_date(d))
@app.get("/api/activity/windows")
async def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):
return window_time(_parse_date(d), app_name)
@app.get("/api/activity/timeline")
async def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):
return timeline(_parse_date(d), interval)
# ── Search ───────────────────────────────────────────────────────────────────
@app.get("/api/search/ocr")
async def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):
return ocr_search(q, _parse_date(d), limit)
@app.get("/api/search/audio")
async def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):
return audio_search(q, _parse_date(d), limit)
# ── Audio ─────────────────────────────────────────────────────────────────────
@app.get("/api/audio")
async def audio(d: str | None = Query(None)):
return transcriptions(_parse_date(d))
# ── Summaries ─────────────────────────────────────────────────────────────────
@app.get("/api/summary/types")
async def summary_types():
return [{"id": k, "title": v["title"]} for k, v in SUMMARY_TYPES.items()]
@app.post("/api/summary/generate")
async def generate_summary(type: str = "day_recap", d: str | None = None):
result = gen_summary(type, _parse_date(d))
return result
Write
cli.py
cli.py
131 lines
#!/usr/bin/env python3
"""Screenpipe CLI — run summaries and reports on demand."""
import os
import sys
from datetime import date, timedelta
import click
from dotenv import load_dotenv
load_dotenv()
sys.path.insert(0, os.path.dirname(__file__))
from consumers.activity import app_time, window_time, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
def _resolve_date(d_str: str | None) -> date | None:
if not d_str:
return None
if d_str == "yesterday":
return date.today() - timedelta(days=1)
if d_str == "today":
return date.today()
return date.fromisoformat(d_str)
@click.group()
def cli():
"""Screenpipe data explorer and summariser."""
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--type", "-t", "summary_type", default="day_recap",
type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)
def summary(d, summary_type):
"""Generate an AI summary for a date (default: today)."""
target = _resolve_date(d)
click.echo(f"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...")
result = gen_summary(summary_type, target)
click.echo(f"\n{'─'*60}")
click.echo(f" {result['title']} — {result['date']}")
click.echo(f"{'─'*60}\n")
click.echo(result["content"])
if "stats" in result:
s = result["stats"]
click.echo(f"\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, "
f"{s['audio_segments']} audio segments]")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--app", "-a", default=None, help="Filter by app name")
@click.option("--windows", "-w", is_flag=True, help="Show window breakdown instead of apps")
def activity(d, app, windows):
"""Show time spent per app or window."""
target = _resolve_date(d)
label = str(target or date.today())
if windows or app:
rows = window_time(target, app)
click.echo(f"\nWindow time — {label}" + (f" [{app}]" if app else ""))
click.echo(f"{'App':<25} {'Window':<40} {'Min':>6}")
click.echo("─" * 75)
for r in rows:
click.echo(f"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}")
else:
rows = app_time(target)
stats = summary_stats(target)
click.echo(f"\nApp time — {label}")
click.echo(f"{'App':<30} {'Minutes':>8}")
click.echo("─" * 40)
for r in rows:
click.echo(f"{r['app_name']:<30} {r['minutes']:>8}")
click.echo(f"\nTotal frames: {stats['total_frames']} | "
f"Active: {stats['first_seen']} → {stats['last_seen']}")
@cli.command()
@click.argument("query")
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--audio", is_flag=True, help="Search audio instead of screen text")
@click.option("--limit", "-n", default=20, show_default=True)
def search(query, d, audio, limit):
"""Search OCR screen text or audio transcriptions."""
from consumers.audio import search as audio_search_fn
target = _resolve_date(d)
if audio:
rows = audio_search_fn(query, target, limit)
click.echo(f"\nAudio results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['snippet']}")
else:
rows = ocr_search(query, target, limit)
click.echo(f"\nOCR results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}")
click.echo(f" {r['snippet']}")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
def audio(d):
"""Show audio transcriptions for a date."""
target = _resolve_date(d)
rows = transcriptions(target)
if not rows:
click.echo("No audio transcriptions found.")
return
click.echo(f"\nAudio transcriptions — {target or date.today()}")
click.echo("─" * 60)
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
click.echo(f"[{r['timestamp']}] [{label}] {r['transcription']}")
@cli.command()
def serve():
"""Start the web UI (runs uvicorn on port 8000)."""
import uvicorn
click.echo("Starting Screenpipe dashboard at [URL_WITH_CREDENTIALS] (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
padding: 16px;
}
.card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }
.bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }
.bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }
.bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }
.bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }
td { padding: 6px 8px; border-bottom: 1px solid var(--border); }
tr:last-child td { border-bottom: none; }
tr:hover td { background: rgba(255,255,255,0.02); }
.timeline-wrap { overflow-x: auto; }
.timeline-grid { display: grid; gap: 2px; min-width: 600px; }
.tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }
.tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }
.tl-cell {
flex: 1;
height: 20px;
border-radius: 3px;
background: var(--border);
position: relative;
cursor: default;
font-size: 10px;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
color: white;
}
.summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
select {
background: var(--bg);
border: 1px solid var(--border);
color: var(--text);
padding: 6px 10px;
border-radius: 6px;
font-size: 13px;
}
button {
background: var(--accent);
color: white;
border: none;
padding: 8px 18px;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
font-weight: 500;
}
button:hover { opacity: 0.85; }
button:disabled { opacity: 0.4; cursor: default; }
.summary-output {
background: var(--bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 20px;
white-space: pre-wrap;
font-family: inherit;
line-height: 1.6;
min-height: 200px;
color: var(--text);
}
.summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }
.summary-output ul { padding-left: 20px; }
.summary-output strong { color: var(--accent2); }
.search-bar { display: flex; gap: 8px; margin-bottom: 16px; }
.search-bar input[type="text"] { flex: 1; }
.search-bar select { }
.result-item {
border-bottom: 1px solid var(--border);
padding: 10px 4px;
}
.result-item:last-child { border-bottom: none; }
.result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }
.result-snippet { font-size: 13px; }
.result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }
.audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }
.audio-item:last-child { border-bottom: none; }
.audio-badge {
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
flex-shrink: 0;
font-weight: 600;
}
.audio-badge.mic { background: rgba(76,175,136,0.2); color: var(--green); }
.audio-badge.sys { background: rgba(74,163,224,0.2); ...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Build screenpipe data UI…, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Build screenpipe data UI and summary app","depth":18,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"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":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Let me explore the screenpipe directory to understand what we're working with.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List screenpipe directory contents","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"data\ndb.sqlite\npipes\n#recycle\n[rerun: b1]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List data and pipes directories","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09\n2026-04-11\nai-habits\nday-recap\nmeeting-summary\nstandup-update\ntime-breakdown\nvideo-export\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List tables in screenpipe SQLite database","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \".tables\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx\n[rerun: b3]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get ocr_text table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(ocr_text);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|frame_id|INTEGER|1||0\n1|text|TEXT|1||0\n2|text_json|TEXT|0||0\n3|app_name|TEXT|1|''|0\n4|ocr_engine|TEXT|1|'unknown'|0\n5|window_name|TEXT|0||0\n6|focused|BOOLEAN|0|FALSE|0\n7|text_length|INTEGER|0||0\n8|sync_id|TEXT|0||0\n9|synced_at|DATETIME|0||0\n[rerun: b4]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get audio_transcriptions table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(audio_transcriptions);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|audio_chunk_id|INTEGER|1||0\n2|offset_index|INTEGER|1||0\n3|timestamp|TIMESTAMP|1||0\n4|transcription|TEXT|1||0\n5|device|TEXT|1|''|0\n6|is_input_device|BOOLEAN|1|TRUE|0\n7|speaker_id|INTEGER|0||0\n8|transcription_engine|TEXT|1|'Whisper'|0\n9|start_time|REAL|0||0\n10|end_time|REAL|0||0\n11|text_length|INTEGER|0||0\n12|sync_id|TEXT|0||0\n13|synced_at|DATETIME|0||0\n[rerun: b5]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get frames, ui_events, video_chunks schemas","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|video_chunk_id|INTEGER|0|NULL|0\n2|offset_index|INTEGER|1|0|0\n3|timestamp|TIMESTAMP|1||0\n4|name|TEXT|0||0\n5|app_name|TEXT|0|NULL|0\n6|window_name|TEXT|0|NULL|0\n7|focused|BOOLEAN|0|NULL|0\n8|browser_url|TEXT|0|NULL|0\n9|device_name|TEXT|1|''|0\n10|sync_id|TEXT|0||0\n11|machine_id|TEXT|0||0\n12|synced_at|DATETIME|0||0\n13|snapshot_path|TEXT|0|NULL|0\n14|accessibility_text|TEXT|0|NULL|0\n15|accessibility_tree_json|TEXT|0|NULL|0\n16|content_hash|INTEGER|0|NULL|0\n17|simhash|INTEGER|0|NULL|0\n18|capture_trigger|TEXT|0|NULL|0\n19|text_source|TEXT|0|NULL|0\n20|cloud_blob_id|TEXT|0|NULL|0\n21|full_text|TEXT|0|NULL|0\n22|elements_ref_frame_id|INTEGER|0|NULL|0\n0|id|INTEGER|0||1\n1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0\n2|session_id|TEXT|0||0\n3|relative_ms|INTEGER|1|0|0\n4|event_type|TEXT|1||0\n5|x|INTEGER|0||0\n6|y|INTEGER|0||0\n7|delta_x|INTEGER|0||0\n8|delta_y|INTEGER|0||0\n9|button|INTEGER|0||0\n10|click_count|INTEGER|0||0\n11|key_code|INTEGER|0||0\n12|modifiers|INTEGER|0||0\n13|text_content|TEXT|0||0\n14|text_length|INTEGER|0||0\n15|app_name|TEXT|0||0\n16|app_pid|INTEGER|0||0\n17|window_title|TEXT|0||0\n18|browser_url|TEXT|0||0\n19|element_role|TEXT|0||0\n20|element_name|TEXT|0||0\n21|element_value|TEXT|0||0\n22|element_description|TEXT|0||0\n23|element_automation_id|TEXT|0||0\n24|element_bounds|TEXT|0||0\n25|frame_id|INTEGER|0||0\n26|sync_id|TEXT|0||0\n27|machine_id|TEXT|0||0\n28|synced_at|DATETIME|0||0\n0|id|INTEGER|0||1\n1|file_path|TEXT|1||0\n2|device_name|TEXT|1|''|0\n3|sync_id|TEXT|0||0\n4|machine_id|TEXT|0||0\n5|synced_at|DATETIME|0||0\n6|fps|REAL|1|0.5|0\n7|cloud_blob_id|TEXT|0|NULL|0\n[rerun: b6]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check data counts and date ranges","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*) FROM ocr_text;\" 2>/dev/null","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00\n3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00\n666\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Explore existing pipes for patterns","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Read day-recap pipe documentation","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cat /volume1/screenpipe/pipes/day-recap/pipe.md","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"---\nschedule: manual\nenabled: true\ntemplate: true\ntitle: Day Recap\ndescription: \"Today's accomplishments, key moments, and unfinished work\"\nicon: \"📋\"\nfeatured: true\n---\n\nAnalyze my screen and audio recordings from today (last 16 hours only). \n\nRead screenpipe skill first.\n\nUse this exact format:\n\n## Summary\nOne sentence: what I mainly did today.\n\n## Accomplishments\n- Top 3 things I finished, with timestamps (e.g. \"2:30 PM\")\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things I saw, said, or heard — with timestamps\n\n## Unfinished Work\n- What I should continue tomorrow — name the app/file/task\n\n## Patterns\n- Apps I used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with: \"**Next step:** [most important thing to continue]\"\n[rerun: b9]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample app names from frames","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Safari\nActivity Monitor\nDia\niTerm2\nControl Centre\nUserNotificationCenter\nFinder\nClaude\nSlack\nFirefox\nRaycast\nNetAuthAgent\nQuickTime Player\n[rerun: b10]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample joined frame+ocr data for today","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE\n2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER\n2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p\n2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p\n2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample recent audio transcriptions","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09T17:02:52+00:00|.|System Audio\n2026-04-09T16:59:22+00:00|Class is technically...|System Audio\n2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio\n[rerun: b12]","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Good data to work with. Here's what we have:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ocr_text","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Screen captures with OCR text, app name, window name (1135 frames so far)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"audio_transcriptions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Voice/system audio transcripts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ui_events","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Mouse/keyboard events with app context","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Raw video files","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Before I start building, a few quick questions:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Tech stack","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"AI summaries","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"What summaries matter most?","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Day recap (what apps/windows you used, key text seen)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"App time breakdown (time per app)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Audio/conversation recap","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Custom searchable timeline","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Here's the architecture I'm thinking:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"/volume1/screenpipe/app/\n├── main.py # FastAPI web UI\n├── cli.py # Click CLI: `python cli.py day-recap`\n├── db.py # Read-only queries against db.sqlite\n├── consumers/\n│ ├── activity.py # App usage, time per window\n│ ├── ocr.py # OCR text aggregation + search\n│ ├── audio.py # Transcription queries\n│ └── summary.py # AI summary builder\n└── static/\n └── index.html # Single-page UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"CLI commands would look like:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"python cli.py day-recap # EOD summary\npython cli.py activity --date today # App time breakdown\npython cli.py search \"docker\" # Search OCR/audio text\npython cli.py serve # Launch web UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Does this direction work? Any preferences on the stack or which summaries to prioritize?","depth":22,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"seesm ok","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Python and available packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 --version && pip3 list 2>/dev/null | grep -E \"fastapi|uvicorn|click|anthropic|httpx|jinja\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Python 3.11.2\n[rerun: b1]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Verify join works for today's data","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"\nSELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len\nFROM frames f JOIN ocr_text o ON f.id = o.frame_id\nWHERE DATE(f.timestamp) = '2026-04-11'\nORDER BY f.timestamp DESC LIMIT 3;\n\"","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T12:54:42.597794+00:00|||2111\n2026-04-11T12:54:41.915916+00:00|||2110\n2026-04-11T12:54:39.912712+00:00|||2111\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install required packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"/bin/bash: line 1: pip3: command not found\n[rerun: b3]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Find pip","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"which pip || which pip3 || python3 -m pip --version 2>/dev/null","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\n[rerun: b4]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bootstrap pip then install packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\n/usr/bin/python3: No module named ensurepip\n[rerun: b5]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install pip via apt","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"apt-get install -y python3-pip python3-venv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)\nE: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?\n[rerun: b6]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install pip with sudo","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Reason:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"lets make it in docker, not to install it in nas directly","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Good call. Let me check what Docker setup you already have and build a proper containerized app.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check existing docker-compose for reference","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"consume\ndata\ndb\ndocker-compose.yml\nexport\nmcp-server\nmedia\nredis\ntrash\nservices:\n redis:\n image: redis:8\n command:\n - /bin/sh\n - -c\n - redis-server --requirepass redispass\n container_name: PaperlessNGX-REDIS\n hostname: paper-redis\n security_opt:\n - no-new-privileges:true\n read_only: true\n user: 1000:10\n healthcheck:\n test: [\"CMD-SHELL\", \"redis-cli ping || exit 1\"]\n volumes:\n - /volume2/docker/paperlessngx/redis:/data:rw\n environment:\n TZ: Europe/Sofia\n restart: always\n\n db:\n image: postgres:17\n container_name: PaperlessNGX-DB\n hostname: paper-db\n mem_limit: 1g\n security_opt:\n - no-new-privileges:true\n healthcheck:\n test: [\"CMD\", \"pg_isready\", \"-q\", \"-d\", \"paperless\", \"-U\", \"paperlessuser\"]\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Docker availability","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"docker --version && docker compose version 2>/dev/null","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Docker version 26.1.0, build 9714adc\nDocker Compose version v2.26.1\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Create app directory structure","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"[rerun: b9]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Now let me build everything. I'll create all the files:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"requirements.txt","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"requirements.txt","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"6 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"fastapi==0.115.12\nuvicorn[standard]==0.34.0\nclick==8.1.8\nanthropic==0.49.0\npython-dotenv==1.1.0","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"13 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"FROM python:3.12-slim\n\nWORKDIR /app\n\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY . .\n\nEXPOSE 8000\n\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"db.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"db.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"28 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"import sqlite3\nfrom contextlib import contextmanager\nfrom datetime import date, datetime, timedelta, timezone\nfrom typing import Generator\n\nDB_PATH = \"/data/db.sqlite\"\n\n\n@contextmanager\ndef get_conn() -> Generator[sqlite3.Connection, None, None]:\n conn = sqlite3.connect(f\"file:{DB_PATH}?mode=ro\", uri=True)\n conn.row_factory = sqlite3.Row\n try:\n yield conn\n finally:\n conn.close()\n\n\ndef date_range(for_date: date) -> tuple[str, str]:\n \"\"\"Return ISO timestamps for start/end of a given date (UTC).\"\"\"\n start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)\n end = start + timedelta(days=1)\n return start.isoformat(), end.isoformat()\n\n\ndef today() -> date:\n return datetime.now(timezone.utc).date()","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"__init__.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"__init__.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1 line","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"activity.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"activity.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"123 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"App usage and window focus time consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef app_time(for_date: date | None = None) -> list[dict[str, Any]]:\n \"\"\"Return minutes spent per app for a given date, sorted descending.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n o.app_name,\n COUNT(*) as frame_count,\n -- each frame ~ 2s at 0.5fps; convert to minutes\n ROUND(COUNT(*) * 2.0 / 60, 1) as minutes\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n GROUP BY o.app_name\n ORDER BY frame_count DESC\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:\n \"\"\"Return minutes spent per window/tab, optionally filtered by app.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n query = \"\"\"\n SELECT\n o.app_name,\n o.window_name,\n COUNT(*) as frame_count,\n ROUND(COUNT(*) * 2.0 / 60, 1) as minutes\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n \"\"\"\n params: list = [start, end]\n if app:\n query += \" AND o.app_name = ?\"\n params.append(app)\n query += \" GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50\"\n\n with get_conn() as conn:\n rows = conn.execute(query, params).fetchall()\n return [dict(r) for r in rows]\n\n\ndef timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:\n \"\"\"Return activity bucketed into N-minute intervals.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n interval_sec = interval_minutes * 60\n\n with get_conn() as conn:\n rows = conn.execute(\n f\"\"\"\n SELECT\n datetime(\n (strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},\n 'unixepoch'\n ) as bucket,\n o.app_name,\n COUNT(*) as frames\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n GROUP BY bucket, o.app_name\n ORDER BY bucket, frames DESC\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef summary_stats(for_date: date | None = None) -> dict[str, Any]:\n \"\"\"Return high-level stats for a date.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n frames_row = conn.execute(\n \"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last \"\n \"FROM frames WHERE timestamp >= ? AND timestamp < ?\",\n (start, end),\n ).fetchone()\n\n app_count = conn.execute(\n \"\"\"\n SELECT COUNT(DISTINCT o.app_name) as n\n FROM frames f JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''\n \"\"\",\n (start, end),\n ).fetchone()\n\n audio_count = conn.execute(\n \"SELECT COUNT(*) as n FROM audio_transcriptions \"\n \"WHERE timestamp >= ? AND timestamp < ?\",\n (start, end),\n ).fetchone()\n\n return {\n \"date\": str(d),\n \"total_frames\": frames_row[\"n\"],\n \"first_seen\": frames_row[\"first\"],\n \"last_seen\": frames_row[\"last\"],\n \"unique_apps\": app_count[\"n\"],\n \"audio_segments\": audio_count[\"n\"],\n }","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"ocr.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ocr.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"92 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"OCR text search and aggregation consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:\n \"\"\"Full-text search OCR content.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n f.timestamp,\n o.app_name,\n o.window_name,\n snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet\n FROM ocr_text_fts\n JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid\n JOIN frames f ON o.frame_id = f.id\n WHERE ocr_text_fts MATCH ?\n AND f.timestamp >= ? AND f.timestamp < ?\n ORDER BY rank\n LIMIT ?\n \"\"\",\n (query, start, end, limit),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:\n \"\"\"Return all OCR text for a date, optionally only focused windows.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n query = \"\"\"\n SELECT\n f.timestamp,\n o.app_name,\n o.window_name,\n o.text\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n AND length(o.text) > 20\n \"\"\"\n params: list = [start, end]\n if focused_only:\n query += \" AND o.focused = TRUE\"\n query += \" ORDER BY f.timestamp\"\n\n with get_conn() as conn:\n rows = conn.execute(query, params).fetchall()\n return [dict(r) for r in rows]\n\n\ndef deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:\n \"\"\"\n Return OCR text deduplicated by time chunk + app to reduce LLM token usage.\n Groups frames into N-minute buckets and returns one representative text per app per bucket.\n \"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n interval_sec = chunk_minutes * 60\n\n with get_conn() as conn:\n rows = conn.execute(\n f\"\"\"\n SELECT\n datetime(\n (strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},\n 'unixepoch'\n ) as bucket,\n o.app_name,\n o.window_name,\n substr(o.text, 1, 500) as text\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n AND length(o.text) > 20\n GROUP BY bucket, o.app_name\n ORDER BY bucket\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"audio.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"audio.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"61 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"Audio transcription consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:\n \"\"\"Return all audio transcriptions for a date.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT timestamp, transcription, device, is_input_device, speaker_id\n FROM audio_transcriptions\n WHERE timestamp >= ? AND timestamp < ?\n AND length(transcription) > 2\n ORDER BY timestamp\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:\n \"\"\"Search audio transcriptions.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n a.timestamp,\n a.device,\n snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet\n FROM audio_transcriptions_fts\n JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id\n WHERE audio_transcriptions_fts MATCH ?\n AND a.timestamp >= ? AND a.timestamp < ?\n ORDER BY rank\n LIMIT ?\n \"\"\",\n (query, start, end, limit),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef formatted_transcript(for_date: date | None = None) -> str:\n \"\"\"Return audio as a readable transcript string.\"\"\"\n rows = transcriptions(for_date)\n if not rows:\n return \"(no audio transcriptions)\"\n lines = []\n for r in rows:\n label = \"MIC\" if r[\"is_input_device\"] else \"SYS\"\n lines.append(f\"[{r['timestamp']}] [{label}] {r['transcription']}\")\n return \"\\n\".join(lines)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"summary.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"summary.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"162 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"AI summary generator using Claude.\"\"\"\nimport os\nfrom datetime import date\nfrom typing import Any\n\nfrom consumers.activity import app_time, summary_stats\nfrom consumers.ocr import deduplicated_text\nfrom consumers.audio import formatted_transcript\n\n\nSUMMARY_TYPES = {\n \"day_recap\": {\n \"title\": \"Day Recap\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\n## Audio/speech:\n{audio}\n\nWrite a concise day recap using EXACTLY this format:\n\n## Summary\nOne sentence: what I mainly worked on today.\n\n## Accomplishments\n- Top 3 things I finished, with approximate times\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things seen or heard, with timestamps\n\n## Unfinished Work\n- What to continue tomorrow\n\n## Patterns\n- Apps used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with:\n**Next step:** [most important thing to continue]\"\"\",\n },\n \"standup\": {\n \"title\": \"Standup Update\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\n## Audio/speech:\n{audio}\n\nWrite a brief standup update:\n\n**Yesterday:** What I worked on (2-3 bullets)\n**Today:** What I plan to continue (1-2 bullets)\n**Blockers:** Any issues observed (or \"None\")\n\nKeep it under 150 words. Only report what's verifiable from the data.\"\"\",\n },\n \"focus_time\": {\n \"title\": \"Focus & Distraction Analysis\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\nAnalyze focus vs distraction patterns:\n\n## Deep Work Periods\n- When and how long were sustained focus sessions?\n- What was being worked on?\n\n## Distractions\n- Which apps/sites were used recreationally?\n- How much time was lost to context switching?\n\n## Recommendations\n- 2-3 concrete suggestions to improve focus tomorrow\n\nBe specific with times and app names.\"\"\",\n },\n}\n\n\ndef _build_context(for_date: date) -> dict[str, str]:\n apps = app_time(for_date)\n app_lines = \"\\n\".join(f\"- {a['app_name']}: {a['minutes']} min\" for a in apps[:20])\n\n ocr_rows = deduplicated_text(for_date, chunk_minutes=5)\n ocr_lines = \"\\n\".join(\n f\"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}\"\n for r in ocr_rows[:100]\n )\n\n audio = formatted_transcript(for_date)\n\n return {\n \"app_time\": app_lines or \"(no app data)\",\n \"ocr_text\": ocr_lines or \"(no screen data)\",\n \"audio\": audio[:3000] if len(audio) > 3000 else audio,\n }\n\n\ndef generate(\n summary_type: str = \"day_recap\",\n for_date: date | None = None,\n api_key: str | None = None,\n) -> dict[str, Any]:\n \"\"\"Generate an AI summary. Returns dict with 'title', 'content', 'date'.\"\"\"\n import anthropic\n\n d = for_date or date.today()\n key = api_key or os.environ.get(\"ANTHROPIC_API_KEY\", \"\")\n if not key:\n return {\n \"title\": \"Error\",\n \"content\": \"ANTHROPIC_API_KEY not set. Add it to your .env file.\",\n \"date\": str(d),\n }\n\n spec = SUMMARY_TYPES.get(summary_type)\n if not spec:\n return {\"title\": \"Error\", \"content\": f\"Unknown summary type: {summary_type}\", \"date\": str(d)}\n\n stats = summary_stats(d)\n if stats[\"total_frames\"] == 0:\n return {\n \"title\": spec[\"title\"],\n \"content\": f\"No screen data found for {d}.\",\n \"date\": str(d),\n }\n\n ctx = _build_context(d)\n prompt = spec[\"prompt\"].format(**ctx)\n\n client = anthropic.Anthropic(api_key=key)\n message = client.messages.create(\n model=\"claude-opus-4-6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": prompt}],\n )\n\n return {\n \"title\": spec[\"title\"],\n \"content\": message.content[0].text,\n \"date\": str(d),\n \"stats\": stats,\n }","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the FastAPI backend and CLI:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"main.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"89 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"Screenpipe dashboard — FastAPI web UI.\"\"\"\nimport os\nfrom datetime import date, datetime\nfrom typing import Any\n\nfrom dotenv import load_dotenv\nfrom fastapi import FastAPI, Query\nfrom fastapi.responses import HTMLResponse, JSONResponse\nfrom fastapi.staticfiles import StaticFiles\n\nload_dotenv()\n\nfrom consumers.activity import app_time, window_time, timeline, summary_stats\nfrom consumers.ocr import search as ocr_search\nfrom consumers.audio import transcriptions, search as audio_search\nfrom consumers.summary import generate as gen_summary, SUMMARY_TYPES\n\napp = FastAPI(title=\"Screenpipe Dashboard\")\napp.mount(\"/static\", StaticFiles(directory=\"static\"), name=\"static\")\n\n\ndef _parse_date(d: str | None) -> date | None:\n if not d:\n return None\n try:\n return date.fromisoformat(d)\n except ValueError:\n return None\n\n\n@app.get(\"/\", response_class=HTMLResponse)\nasync def index():\n with open(\"static/index.html\") as f:\n return f.read()\n\n\n# ── Activity ──────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/stats\")\nasync def stats(d: str | None = Query(None)):\n return summary_stats(_parse_date(d))\n\n\n@app.get(\"/api/activity/apps\")\nasync def activity_apps(d: str | None = Query(None)):\n return app_time(_parse_date(d))\n\n\n@app.get(\"/api/activity/windows\")\nasync def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):\n return window_time(_parse_date(d), app_name)\n\n\n@app.get(\"/api/activity/timeline\")\nasync def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):\n return timeline(_parse_date(d), interval)\n\n\n# ── Search ───────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/search/ocr\")\nasync def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):\n return ocr_search(q, _parse_date(d), limit)\n\n\n@app.get(\"/api/search/audio\")\nasync def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):\n return audio_search(q, _parse_date(d), limit)\n\n\n# ── Audio ─────────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/audio\")\nasync def audio(d: str | None = Query(None)):\n return transcriptions(_parse_date(d))\n\n\n# ── Summaries ─────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/summary/types\")\nasync def summary_types():\n return [{\"id\": k, \"title\": v[\"title\"]} for k, v in SUMMARY_TYPES.items()]\n\n\n@app.post(\"/api/summary/generate\")\nasync def generate_summary(type: str = \"day_recap\", d: str | None = None):\n result = gen_summary(type, _parse_date(d))\n return result","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"cli.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"cli.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"131 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"#!/usr/bin/env python3\n\"\"\"Screenpipe CLI — run summaries and reports on demand.\"\"\"\nimport os\nimport sys\nfrom datetime import date, timedelta\n\nimport click\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nsys.path.insert(0, os.path.dirname(__file__))\n\nfrom consumers.activity import app_time, window_time, summary_stats\nfrom consumers.ocr import search as ocr_search\nfrom consumers.audio import transcriptions\nfrom consumers.summary import generate as gen_summary, SUMMARY_TYPES\n\n\ndef _resolve_date(d_str: str | None) -> date | None:\n if not d_str:\n return None\n if d_str == \"yesterday\":\n return date.today() - timedelta(days=1)\n if d_str == \"today\":\n return date.today()\n return date.fromisoformat(d_str)\n\n\n@click.group()\ndef cli():\n \"\"\"Screenpipe data explorer and summariser.\"\"\"\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--type\", \"-t\", \"summary_type\", default=\"day_recap\",\n type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)\ndef summary(d, summary_type):\n \"\"\"Generate an AI summary for a date (default: today).\"\"\"\n target = _resolve_date(d)\n click.echo(f\"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...\")\n result = gen_summary(summary_type, target)\n click.echo(f\"\\n{'─'*60}\")\n click.echo(f\" {result['title']} — {result['date']}\")\n click.echo(f\"{'─'*60}\\n\")\n click.echo(result[\"content\"])\n if \"stats\" in result:\n s = result[\"stats\"]\n click.echo(f\"\\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, \"\n f\"{s['audio_segments']} audio segments]\")\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--app\", \"-a\", default=None, help=\"Filter by app name\")\n@click.option(\"--windows\", \"-w\", is_flag=True, help=\"Show window breakdown instead of apps\")\ndef activity(d, app, windows):\n \"\"\"Show time spent per app or window.\"\"\"\n target = _resolve_date(d)\n label = str(target or date.today())\n\n if windows or app:\n rows = window_time(target, app)\n click.echo(f\"\\nWindow time — {label}\" + (f\" [{app}]\" if app else \"\"))\n click.echo(f\"{'App':<25} {'Window':<40} {'Min':>6}\")\n click.echo(\"─\" * 75)\n for r in rows:\n click.echo(f\"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}\")\n else:\n rows = app_time(target)\n stats = summary_stats(target)\n click.echo(f\"\\nApp time — {label}\")\n click.echo(f\"{'App':<30} {'Minutes':>8}\")\n click.echo(\"─\" * 40)\n for r in rows:\n click.echo(f\"{r['app_name']:<30} {r['minutes']:>8}\")\n click.echo(f\"\\nTotal frames: {stats['total_frames']} | \"\n f\"Active: {stats['first_seen']} → {stats['last_seen']}\")\n\n\n@cli.command()\n@click.argument(\"query\")\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--audio\", is_flag=True, help=\"Search audio instead of screen text\")\n@click.option(\"--limit\", \"-n\", default=20, show_default=True)\ndef search(query, d, audio, limit):\n \"\"\"Search OCR screen text or audio transcriptions.\"\"\"\n from consumers.audio import search as audio_search_fn\n\n target = _resolve_date(d)\n if audio:\n rows = audio_search_fn(query, target, limit)\n click.echo(f\"\\nAudio results for '{query}':\")\n for r in rows:\n click.echo(f\" [{r['timestamp']}] {r['snippet']}\")\n else:\n rows = ocr_search(query, target, limit)\n click.echo(f\"\\nOCR results for '{query}':\")\n for r in rows:\n click.echo(f\" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}\")\n click.echo(f\" {r['snippet']}\")\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\ndef audio(d):\n \"\"\"Show audio transcriptions for a date.\"\"\"\n target = _resolve_date(d)\n rows = transcriptions(target)\n if not rows:\n click.echo(\"No audio transcriptions found.\")\n return\n click.echo(f\"\\nAudio transcriptions — {target or date.today()}\")\n click.echo(\"─\" * 60)\n for r in rows:\n label = \"MIC\" if r[\"is_input_device\"] else \"SYS\"\n click.echo(f\"[{r['timestamp']}] [{label}] {r['transcription']}\")\n\n\n@cli.command()\ndef serve():\n \"\"\"Start the web UI (runs uvicorn on port 8000).\"\"\"\n import uvicorn\n click.echo(\"Starting Screenpipe dashboard at http://localhost:8000\")\n uvicorn.run(\"main:app\", host=\"0.0.0.0\", port=8000, reload=False)\n\n\nif __name__ == \"__main__\":\n cli()","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the frontend:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"438 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Screenpipe Dashboard</title>\n<style>\n :root {\n --bg: #0f0f11;\n --surface: #1a1a1f;\n --border: #2a2a35;\n --accent: #7c6fcd;\n --accent2: #4fa3e0;\n --text: #e0e0e8;\n --muted: #888899;\n --green: #4caf88;\n --red: #e06060;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { background: var(--bg); color: var(--text); font-family: 'Segoe UI', system-ui, sans-serif; font-size: 14px; }\n\n header {\n background: var(--surface);\n border-bottom: 1px solid var(--border);\n padding: 12px 24px;\n display: flex;\n align-items: center;\n gap: 16px;\n position: sticky;\n top: 0;\n z-index: 100;\n }\n header h1 { font-size: 16px; font-weight: 600; color: var(--accent); }\n header .spacer { flex: 1; }\n\n .date-picker { display: flex; align-items: center; gap: 8px; }\n .date-picker label { color: var(--muted); font-size: 12px; }\n input[type=\"date\"] {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 13px;\n }\n input[type=\"text\"] {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 13px;\n width: 200px;\n }\n input[type=\"text\"]:focus, input[type=\"date\"]:focus { outline: 1px solid var(--accent); }\n\n .tabs { display: flex; gap: 4px; }\n .tab {\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n color: var(--muted);\n font-size: 13px;\n border: 1px solid transparent;\n background: none;\n }\n .tab.active { background: var(--accent); color: white; }\n .tab:hover:not(.active) { background: var(--border); color: var(--text); }\n\n main { padding: 20px 24px; max-width: 1200px; margin: 0 auto; }\n\n .page { display: none; }\n .page.active { display: block; }\n\n .stats-bar {\n display: flex;\n gap: 16px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n }\n .stat-card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 12px 16px;\n flex: 1;\n min-width: 150px;\n }\n .stat-card .label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; }\n .stat-card .value { font-size: 22px; font-weight: 700; color: var(--accent); margin-top: 4px; }\n .stat-card .sub { color: var(--muted); font-size: 11px; margin-top: 2px; }\n\n .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n @media (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }\n\n .card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 10px;\n padding: 16px;\n }\n .card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }\n\n .bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }\n .bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }\n .bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }\n .bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }\n .bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }\n\n table { width: 100%; border-collapse: collapse; font-size: 13px; }\n th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }\n td { padding: 6px 8px; border-bottom: 1px solid var(--border); }\n tr:last-child td { border-bottom: none; }\n tr:hover td { background: rgba(255,255,255,0.02); }\n\n .timeline-wrap { overflow-x: auto; }\n .timeline-grid { display: grid; gap: 2px; min-width: 600px; }\n .tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }\n .tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }\n .tl-cell {\n flex: 1;\n height: 20px;\n border-radius: 3px;\n background: var(--border);\n position: relative;\n cursor: default;\n font-size: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n color: white;\n }\n\n .summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }\n select {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 13px;\n }\n button {\n background: var(--accent);\n color: white;\n border: none;\n padding: 8px 18px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n }\n button:hover { opacity: 0.85; }\n button:disabled { opacity: 0.4; cursor: default; }\n\n .summary-output {\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 20px;\n white-space: pre-wrap;\n font-family: inherit;\n line-height: 1.6;\n min-height: 200px;\n color: var(--text);\n }\n .summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }\n .summary-output ul { padding-left: 20px; }\n .summary-output strong { color: var(--accent2); }\n\n .search-bar { display: flex; gap: 8px; margin-bottom: 16px; }\n .search-bar input[type=\"text\"] { flex: 1; }\n .search-bar select { }\n\n .result-item {\n border-bottom: 1px solid var(--border);\n padding: 10px 4px;\n }\n .result-item:last-child { border-bottom: none; }\n .result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }\n .result-snippet { font-size: 13px; }\n .result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }\n\n .audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }\n .audio-item:last-child { border-bottom: none; }\n .audio-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 4px;\n flex-shrink: 0;\n font-weight: 600;\n }\n .audio-badge.mic { background: rgba(76,175,136,0.2); color: var(--green); }\n .audio-badge.sys { background: rgba(74,163,224,0.2); color: var(--accent2); }\n .audio-ts { color: var(--muted); font-size: 11px; flex-shrink: 0; }\n\n .spinner { display: inline-block; width: 14px; height: 14px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.7s linear infinite; vertical-align: middle; margin-right: 6px; }\n @keyframes spin { to { transform: rotate(360deg); } }\n\n .empty { color: var(--muted); text-align: center; padding: 40px; font-size: 13px; }\n</style>\n</head>\n<body>\n\n<header>\n <h1>Screenpipe</h1>\n <div class=\"tabs\">\n <button class=\"tab active\" onclick=\"showPage('activity')\">Activity</button>\n <button class=\"tab\" onclick=\"showPage('search')\">Search</button>\n <button class=\"tab\" onclick=\"showPage('audio')\">Audio</button>\n <button class=\"tab\" onclick=\"showPage('summary')\">Summary</button>\n </div>\n <div class=\"spacer\"></div>\n <div class=\"date-picker\">\n <label>Date</label>\n <input type=\"date\" id=\"datePicker\" onchange=\"refresh()\">\n </div>\n</header>\n\n<main>\n\n<!-- ── Activity ─────────────────────────────────────────────── -->\n<div class=\"page active\" id=\"page-activity\">\n <div class=\"stats-bar\" id=\"statsBar\">\n <div class=\"stat-card\"><div class=\"label\">Frames</div><div class=\"value\" id=\"st-frames\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Apps</div><div class=\"value\" id=\"st-apps\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Audio Segs</div><div class=\"value\" id=\"st-audio\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Active</div><div class=\"value\" id=\"st-first\" style=\"font-size:13px;margin-top:6px\">–</div><div class=\"sub\" id=\"st-last\">–</div></div>\n </div>\n <div class=\"grid-2\">\n <div class=\"card\">\n <h2>Time per App</h2>\n <div id=\"appBars\"><div class=\"empty\">Loading...</div></div>\n </div>\n <div class=\"card\">\n <h2>Windows</h2>\n <div id=\"windowTable\"><div class=\"empty\">Click an app bar to filter</div></div>\n </div>\n </div>\n</div>\n\n<!-- ── Search ───────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-search\">\n <div class=\"search-bar\">\n <input type=\"text\" id=\"searchQuery\" placeholder=\"Search screen text...\" onkeydown=\"if(event.key==='Enter') runSearch()\">\n <select id=\"searchTarget\">\n <option value=\"ocr\">Screen (OCR)</option>\n <option value=\"audio\">Audio</option>\n </select>\n <button onclick=\"runSearch()\">Search</button>\n </div>\n <div class=\"card\">\n <div id=\"searchResults\"><div class=\"empty\">Enter a query above to search screen text or audio transcriptions.</div></div>\n </div>\n</div>\n\n<!-- ── Audio ────────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-audio\">\n <div class=\"card\">\n <h2>Audio Transcriptions</h2>\n <div id=\"audioList\"><div class=\"empty\">Loading...</div></div>\n </div>\n</div>\n\n<!-- ── Summary ──────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-summary\">\n <div class=\"summary-controls\">\n <select id=\"summaryType\">\n <option value=\"day_recap\">Day Recap</option>\n <option value=\"standup\">Standup Update</option>\n <option value=\"focus_time\">Focus Analysis</option>\n </select>\n <button id=\"genBtn\" onclick=\"generateSummary()\">Generate</button>\n </div>\n <div class=\"summary-output\" id=\"summaryOutput\">\n Select a summary type and click Generate. Requires ANTHROPIC_API_KEY in your environment.\n </div>\n</div>\n\n</main>\n\n<script>\nconst API = '';\nlet currentPage = 'activity';\nlet currentApp = null;\n\n// ── Date ────────────────────────────────────────────────────────\nconst dp = document.getElementById('datePicker');\ndp.value = new Date().toISOString().slice(0, 10);\nfunction getDate() { return dp.value; }\n\nfunction refresh() {\n if (currentPage === 'activity') loadActivity();\n if (currentPage === 'audio') loadAudio();\n}\n\n// ── Page nav ────────────────────────────────────────────────────\nfunction showPage(name) {\n document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));\n document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));\n document.getElementById('page-' + name).classList.add('active');\n document.querySelectorAll('.tab')[['activity','search','audio','summary'].indexOf(name)].classList.add('active');\n currentPage = name;\n if (name === 'activity') loadActivity();\n if (name === 'audio') loadAudio();\n}\n\n// ── Activity ────────────────────────────────────────────────────\nasync function loadActivity() {\n const d = getDate();\n const [stats, apps] = await Promise.all([\n fetch(`${API}/api/stats?d=${d}`).then(r => r.json()),\n fetch(`${API}/api/activity/apps?d=${d}`).then(r => r.json()),\n ]);\n\n document.getElementById('st-frames').textContent = stats.total_frames ?? '–';\n document.getElementById('st-apps').textContent = stats.unique_apps ?? '–';\n document.getElementById('st-audio').textContent = stats.audio_segments ?? '–';\n document.getElementById('st-first').textContent = stats.first_seen ? fmtTime(stats.first_seen) : '–';\n document.getElementById('st-last').textContent = stats.last_seen ? '→ ' + fmtTime(stats.last_seen) : '';\n\n const max = apps[0]?.minutes || 1;\n const barsEl = document.getElementById('appBars');\n if (!apps.length) { barsEl.innerHTML = '<div class=\"empty\">No data</div>'; return; }\n\n barsEl.innerHTML = apps.slice(0, 20).map(a => `\n <div class=\"bar-item\" onclick=\"loadWindows('${esc(a.app_name)}')\" style=\"cursor:pointer\" title=\"Click to filter windows\">\n <div class=\"name\" title=\"${esc(a.app_name)}\">${esc(a.app_name)}</div>\n <div class=\"bar-wrap\"><div class=\"bar-fill\" style=\"width:${(a.minutes/max*100).toFixed(1)}%\"></div></div>\n <div class=\"mins\">${a.minutes}m</div>\n </div>`).join('');\n\n loadWindows(null);\n}\n\nasync function loadWindows(app) {\n currentApp = app;\n const d = getDate();\n const url = app ? `/api/activity/windows?d=${d}&app_name=${encodeURIComponent(app)}` : `/api/activity/windows?d=${d}`;\n const rows = await fetch(url).then(r => r.json());\n const el = document.getElementById('windowTable');\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No data</div>'; return; }\n el.innerHTML = `<table>\n <thead><tr><th>App</th><th>Window</th><th>Min</th></tr></thead>\n <tbody>${rows.slice(0,30).map(r => `\n <tr><td>${esc(r.app_name)}</td><td title=\"${esc(r.window_name||'')}\">${esc((r.window_name||'').slice(0,50))}</td><td>${r.minutes}</td></tr>\n `).join('')}</tbody>\n </table>`;\n}\n\n// ── Search ──────────────────────────────────────────────────────\nasync function runSearch() {\n const q = document.getElementById('searchQuery').value.trim();\n if (!q) return;\n const target = document.getElementById('searchTarget').value;\n const d = getDate();\n const el = document.getElementById('searchResults');\n el.innerHTML = '<div class=\"empty\"><span class=\"spinner\"></span>Searching...</div>';\n\n const url = target === 'audio'\n ? `/api/search/audio?q=${encodeURIComponent(q)}&d=${d}`\n : `/api/search/ocr?q=${encodeURIComponent(q)}&d=${d}`;\n\n const rows = await fetch(url).then(r => r.json()).catch(() => []);\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No results found.</div>'; return; }\n\n el.innerHTML = rows.map(r => `\n <div class=\"result-item\">\n <div class=\"result-meta\">${r.timestamp ? fmtTime(r.timestamp) : ''} · ${esc(r.app_name||'')} ${r.window_name ? '/ ' + esc(r.window_name) : ''}</div>\n <div class=\"result-snippet\">${highlightSnippet(r.snippet||'')}</div>\n </div>`).join('');\n}\n\nfunction highlightSnippet(s) {\n return esc(s).replace(/\\[/g, '<mark>').replace(/\\]/g, '</mark>');\n}\n\n// ── Audio ───────────────────────────────────────────────────────\nasync function loadAudio() {\n const d = getDate();\n const rows = await fetch(`${API}/api/audio?d=${d}`).then(r => r.json());\n const el = document.getElementById('audioList');\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No audio transcriptions for this date.</div>'; return; }\n el.innerHTML = rows.map(r => `\n <div class=\"audio-item\">\n <span class=\"audio-ts\">${fmtTime(r.timestamp)}</span>\n <span class=\"audio-badge ${r.is_input_device ? 'mic' : 'sys'}\">${r.is_input_device ? 'MIC' : 'SYS'}</span>\n <span>${esc(r.transcription)}</span>\n </div>`).join('');\n}\n\n// ── Summary ─────────────────────────────────────────────────────\nasync function generateSummary() {\n const type = document.getElementById('summaryType').value;\n const d = getDate();\n const btn = document.getElementById('genBtn');\n const out = document.getElementById('summaryOutput');\n btn.disabled = true;\n btn.innerHTML = '<span class=\"spinner\"></span>Generating...';\n out.textContent = 'Sending data to Claude...';\n\n const res = await fetch(`/api/summary/generate?type=${type}&d=${d}`, { method: 'POST' })\n .then(r => r.json()).catch(e => ({ content: 'Error: ' + e.message }));\n\n out.innerHTML = renderMarkdown(res.content || res.error || 'No content');\n btn.disabled = false;\n btn.textContent = 'Generate';\n}\n\n// ── Helpers ─────────────────────────────────────────────────────\nfunction esc(s) {\n return String(s||'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');\n}\n\nfunction fmtTime(ts) {\n if (!ts) return '';\n try {\n const d = new Date(ts);\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n } catch { return ts; }\n}\n\nfunction renderMarkdown(text) {\n return esc(text)\n .replace(/^## (.+)$/gm, '<h2>$1</h2>')\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/^- (.+)$/gm, '<li>$1</li>')\n .replace(/(<li>.*<\\/li>)/s, '<ul>$1</ul>')\n .replace(/\\n/g, '<br>');\n}\n\n// Init\nloadActivity();\n</script>\n</body>\n</html>","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the Docker Compose file:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"}]...
|
-369780725636059547
|
-8187121230352777210
|
idle
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null
Copy code to clipboard
OUT
Exit code 1
[rerun: b4]
Bash
Bootstrap pip then install packages
IN
python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10
Copy code to clipboard
OUT
Exit code 1
/usr/bin/python3: No module named ensurepip
[rerun: b5]
Bash
Install pip via apt
IN
apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
OUT
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
[rerun: b6]
Bash
Install pip with sudo
Reason:
lets make it in docker, not to install it in nas directly
IN
sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
Good call. Let me check what Docker setup you already have and build a proper containerized app.
Bash
Check existing docker-compose for reference
IN
ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30
Copy code to clipboard
OUT
consume
data
db
docker-compose.yml
export
mcp-server
media
redis
trash
services:
redis:
image: redis:8
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
security_opt:
- no-new-privileges:true
read_only: true
user: 1000:10
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- /volume2/docker/paperlessngx/redis:/data:rw
environment:
TZ: Europe/Sofia
restart: always
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
[rerun: b7]
Bash
Check Docker availability
IN
docker --version && docker compose version 2>/dev/null
Copy code to clipboard
OUT
Docker version 26.1.0, build 9714adc
Docker Compose version v2.26.1
[rerun: b8]
Bash
Create app directory structure
IN
mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static
Copy code to clipboard
OUT
[rerun: b9]
Now let me build everything. I'll create all the files:
Write
requirements.txt
requirements.txt
6 lines
fastapi==0.115.12
uvicorn[standard]==0.34.0
click==8.1.8
anthropic==0.49.0
python-dotenv==1.1.0
Write
Dockerfile
Dockerfile
13 lines
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "[IP_ADDRESS]", "--port", "8000"]
Write
db.py
db.py
28 lines
import sqlite3
from contextlib import contextmanager
from datetime import date, datetime, timedelta, timezone
from typing import Generator
DB_PATH = "/data/db.sqlite"
@contextmanager
def get_conn() -> Generator[sqlite3.Connection, None, None]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
yield conn
finally:
conn.close()
def date_range(for_date: date) -> tuple[str, str]:
"""Return ISO timestamps for start/end of a given date (UTC)."""
start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)
end = start + timedelta(days=1)
return start.isoformat(), end.isoformat()
def today() -> date:
return datetime.now(timezone.utc).date()
Write
__init__.py
__init__.py
1 line
Write
activity.py
activity.py
123 lines
"""App usage and window focus time consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def app_time(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per app for a given date, sorted descending."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
o.app_name,
COUNT(*) as frame_count,
-- each frame ~ 2s at 0.5fps; convert to minutes
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY o.app_name
ORDER BY frame_count DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per window/tab, optionally filtered by app."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
o.app_name,
o.window_name,
COUNT(*) as frame_count,
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
"""
params: list = [start, end]
if app:
query += " AND o.app_name = ?"
params.append(app)
query += " GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:
"""Return activity bucketed into N-minute intervals."""
d = for_date or _today()
start, end = date_range(d)
interval_sec = interval_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
COUNT(*) as frames
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY bucket, o.app_name
ORDER BY bucket, frames DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def summary_stats(for_date: date | None = None) -> dict[str, Any]:
"""Return high-level stats for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
frames_row = conn.execute(
"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last "
"FROM frames WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
app_count = conn.execute(
"""
SELECT COUNT(DISTINCT o.app_name) as n
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''
""",
(start, end),
).fetchone()
audio_count = conn.execute(
"SELECT COUNT(*) as n FROM audio_transcriptions "
"WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
return {
"date": str(d),
"total_frames": frames_row["n"],
"first_seen": frames_row["first"],
"last_seen": frames_row["last"],
"unique_apps": app_count["n"],
"audio_segments": audio_count["n"],
}
Write
ocr.py
ocr.py
92 lines
"""OCR text search and aggregation consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:
"""Full-text search OCR content."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
f.timestamp,
o.app_name,
o.window_name,
snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet
FROM ocr_text_fts
JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid
JOIN frames f ON o.frame_id = f.id
WHERE ocr_text_fts MATCH ?
AND f.timestamp >= ? AND f.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:
"""Return all OCR text for a date, optionally only focused windows."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
f.timestamp,
o.app_name,
o.window_name,
o.text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
"""
params: list = [start, end]
if focused_only:
query += " AND o.focused = TRUE"
query += " ORDER BY f.timestamp"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:
"""
Return OCR text deduplicated by time chunk + app to reduce LLM token usage.
Groups frames into N-minute buckets and returns one representative text per app per bucket.
"""
d = for_date or _today()
start, end = date_range(d)
interval_sec = chunk_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
o.window_name,
substr(o.text, 1, 500) as text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
GROUP BY bucket, o.app_name
ORDER BY bucket
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
Write
audio.py
audio.py
61 lines
"""Audio transcription consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return all audio transcriptions for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT timestamp, transcription, device, is_input_device, speaker_id
FROM audio_transcriptions
WHERE timestamp >= ? AND timestamp < ?
AND length(transcription) > 2
ORDER BY timestamp
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:
"""Search audio transcriptions."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
a.timestamp,
a.device,
snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet
FROM audio_transcriptions_fts
JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id
WHERE audio_transcriptions_fts MATCH ?
AND a.timestamp >= ? AND a.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def formatted_transcript(for_date: date | None = None) -> str:
"""Return audio as a readable transcript string."""
rows = transcriptions(for_date)
if not rows:
return "(no audio transcriptions)"
lines = []
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
lines.append(f"[{r['timestamp']}] [{label}] {r['transcription']}")
return "\n".join(lines)
Write
summary.py
summary.py
162 lines
"""AI summary generator using Claude."""
import os
from datetime import date
from typing import Any
from consumers.activity import app_time, summary_stats
from consumers.ocr import deduplicated_text
from consumers.audio import formatted_transcript
SUMMARY_TYPES = {
"day_recap": {
"title": "Day Recap",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a concise day recap using EXACTLY this format:
## Summary
One sentence: what I mainly worked on today.
## Accomplishments
- Top 3 things I finished, with approximate times
- Name specific apps, files, or projects
## Key Moments
- Important things seen or heard, with timestamps
## Unfinished Work
- What to continue tomorrow
## Patterns
- Apps used most, topics that came up repeatedly
Only report what you can verify from the data. End with:
**Next step:** [most important thing to continue]""",
},
"standup": {
"title": "Standup Update",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a brief standup update:
**Yesterday:** What I worked on (2-3 bullets)
**Today:** What I plan to continue (1-2 bullets)
**Blockers:** Any issues observed (or "None")
Keep it under 150 words. Only report what's verifiable from the data.""",
},
"focus_time": {
"title": "Focus & Distraction Analysis",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
Analyze focus vs distraction patterns:
## Deep Work Periods
- When and how long were sustained focus sessions?
- What was being worked on?
## Distractions
- Which apps/sites were used recreationally?
- How much time was lost to context switching?
## Recommendations
- 2-3 concrete suggestions to improve focus tomorrow
Be specific with times and app names.""",
},
}
def _build_context(for_date: date) -> dict[str, str]:
apps = app_time(for_date)
app_lines = "\n".join(f"- {a['app_name']}: {a['minutes']} min" for a in apps[:20])
ocr_rows = deduplicated_text(for_date, chunk_minutes=5)
ocr_lines = "\n".join(
f"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}"
for r in ocr_rows[:100]
)
audio = formatted_transcript(for_date)
return {
"app_time": app_lines or "(no app data)",
"ocr_text": ocr_lines or "(no screen data)",
"audio": audio[:3000] if len(audio) > 3000 else audio,
}
def generate(
summary_type: str = "day_recap",
for_date: date | None = None,
api_key: str | None = None,
) -> dict[str, Any]:
"""Generate an AI summary. Returns dict with 'title', 'content', 'date'."""
import anthropic
d = for_date or date.today()
key = api_key or os.environ.get("ANTHROPIC_API_KEY", "")
if not key:
return {
"title": "Error",
"content": "ANTHROPIC_API_KEY not set. Add it to your .env file.",
"date": str(d),
}
spec = SUMMARY_TYPES.get(summary_type)
if not spec:
return {"title": "Error", "content": f"Unknown summary type: {summary_type}", "date": str(d)}
stats = summary_stats(d)
if stats["total_frames"] == 0:
return {
"title": spec["title"],
"content": f"No screen data found for {d}.",
"date": str(d),
}
ctx = _build_context(d)
prompt = spec["prompt"].format(**ctx)
client = anthropic.Anthropic(api_key=key)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return {
"title": spec["title"],
"content": message.content[0].text,
"date": str(d),
"stats": stats,
}
Now the FastAPI backend and CLI:
Write
main.py
main.py
89 lines
"""Screenpipe dashboard — FastAPI web UI."""
import os
from datetime import date, datetime
from typing import Any
from dotenv import load_dotenv
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
load_dotenv()
from consumers.activity import app_time, window_time, timeline, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions, search as audio_search
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
app = FastAPI(title="Screenpipe Dashboard")
app.mount("/static", StaticFiles(directory="static"), name="static")
def _parse_date(d: str | None) -> date | None:
if not d:
return None
try:
return date.fromisoformat(d)
except ValueError:
return None
@app.get("/", response_class=HTMLResponse)
async def index():
with open("static/index.html") as f:
return f.read()
# ── Activity ──────────────────────────────────────────────────────────────────
@app.get("/api/stats")
async def stats(d: str | None = Query(None)):
return summary_stats(_parse_date(d))
@app.get("/api/activity/apps")
async def activity_apps(d: str | None = Query(None)):
return app_time(_parse_date(d))
@app.get("/api/activity/windows")
async def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):
return window_time(_parse_date(d), app_name)
@app.get("/api/activity/timeline")
async def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):
return timeline(_parse_date(d), interval)
# ── Search ───────────────────────────────────────────────────────────────────
@app.get("/api/search/ocr")
async def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):
return ocr_search(q, _parse_date(d), limit)
@app.get("/api/search/audio")
async def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):
return audio_search(q, _parse_date(d), limit)
# ── Audio ─────────────────────────────────────────────────────────────────────
@app.get("/api/audio")
async def audio(d: str | None = Query(None)):
return transcriptions(_parse_date(d))
# ── Summaries ─────────────────────────────────────────────────────────────────
@app.get("/api/summary/types")
async def summary_types():
return [{"id": k, "title": v["title"]} for k, v in SUMMARY_TYPES.items()]
@app.post("/api/summary/generate")
async def generate_summary(type: str = "day_recap", d: str | None = None):
result = gen_summary(type, _parse_date(d))
return result
Write
cli.py
cli.py
131 lines
#!/usr/bin/env python3
"""Screenpipe CLI — run summaries and reports on demand."""
import os
import sys
from datetime import date, timedelta
import click
from dotenv import load_dotenv
load_dotenv()
sys.path.insert(0, os.path.dirname(__file__))
from consumers.activity import app_time, window_time, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
def _resolve_date(d_str: str | None) -> date | None:
if not d_str:
return None
if d_str == "yesterday":
return date.today() - timedelta(days=1)
if d_str == "today":
return date.today()
return date.fromisoformat(d_str)
@click.group()
def cli():
"""Screenpipe data explorer and summariser."""
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--type", "-t", "summary_type", default="day_recap",
type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)
def summary(d, summary_type):
"""Generate an AI summary for a date (default: today)."""
target = _resolve_date(d)
click.echo(f"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...")
result = gen_summary(summary_type, target)
click.echo(f"\n{'─'*60}")
click.echo(f" {result['title']} — {result['date']}")
click.echo(f"{'─'*60}\n")
click.echo(result["content"])
if "stats" in result:
s = result["stats"]
click.echo(f"\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, "
f"{s['audio_segments']} audio segments]")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--app", "-a", default=None, help="Filter by app name")
@click.option("--windows", "-w", is_flag=True, help="Show window breakdown instead of apps")
def activity(d, app, windows):
"""Show time spent per app or window."""
target = _resolve_date(d)
label = str(target or date.today())
if windows or app:
rows = window_time(target, app)
click.echo(f"\nWindow time — {label}" + (f" [{app}]" if app else ""))
click.echo(f"{'App':<25} {'Window':<40} {'Min':>6}")
click.echo("─" * 75)
for r in rows:
click.echo(f"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}")
else:
rows = app_time(target)
stats = summary_stats(target)
click.echo(f"\nApp time — {label}")
click.echo(f"{'App':<30} {'Minutes':>8}")
click.echo("─" * 40)
for r in rows:
click.echo(f"{r['app_name']:<30} {r['minutes']:>8}")
click.echo(f"\nTotal frames: {stats['total_frames']} | "
f"Active: {stats['first_seen']} → {stats['last_seen']}")
@cli.command()
@click.argument("query")
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--audio", is_flag=True, help="Search audio instead of screen text")
@click.option("--limit", "-n", default=20, show_default=True)
def search(query, d, audio, limit):
"""Search OCR screen text or audio transcriptions."""
from consumers.audio import search as audio_search_fn
target = _resolve_date(d)
if audio:
rows = audio_search_fn(query, target, limit)
click.echo(f"\nAudio results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['snippet']}")
else:
rows = ocr_search(query, target, limit)
click.echo(f"\nOCR results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}")
click.echo(f" {r['snippet']}")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
def audio(d):
"""Show audio transcriptions for a date."""
target = _resolve_date(d)
rows = transcriptions(target)
if not rows:
click.echo("No audio transcriptions found.")
return
click.echo(f"\nAudio transcriptions — {target or date.today()}")
click.echo("─" * 60)
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
click.echo(f"[{r['timestamp']}] [{label}] {r['transcription']}")
@cli.command()
def serve():
"""Start the web UI (runs uvicorn on port 8000)."""
import uvicorn
click.echo("Starting Screenpipe dashboard at [URL_WITH_CREDENTIALS] (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
padding: 16px;
}
.card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }
.bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }
.bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }
.bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }
.bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }
td { padding: 6px 8px; border-bottom: 1px solid var(--border); }
tr:last-child td { border-bottom: none; }
tr:hover td { background: rgba(255,255,255,0.02); }
.timeline-wrap { overflow-x: auto; }
.timeline-grid { display: grid; gap: 2px; min-width: 600px; }
.tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }
.tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }
.tl-cell {
flex: 1;
height: 20px;
border-radius: 3px;
background: var(--border);
position: relative;
cursor: default;
font-size: 10px;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
color: white;
}
.summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
select {
background: var(--bg);
border: 1px solid var(--border);
color: var(--text);
padding: 6px 10px;
border-radius: 6px;
font-size: 13px;
}
button {
background: var(--accent);
color: white;
border: none;
padding: 8px 18px;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
font-weight: 500;
}
button:hover { opacity: 0.85; }
button:disabled { opacity: 0.4; cursor: default; }
.summary-output {
background: var(--bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 20px;
white-space: pre-wrap;
font-family: inherit;
line-height: 1.6;
min-height: 200px;
color: var(--text);
}
.summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }
.summary-output ul { padding-left: 20px; }
.summary-output strong { color: var(--accent2); }
.search-bar { display: flex; gap: 8px; margin-bottom: 16px; }
.search-bar input[type="text"] { flex: 1; }
.search-bar select { }
.result-item {
border-bottom: 1px solid var(--border);
padding: 10px 4px;
}
.result-item:last-child { border-bottom: none; }
.result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }
.result-snippet { font-size: 13px; }
.result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }
.audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }
.audio-item:last-child { border-bottom: none; }
.audio-badge {
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
flex-shrink: 0;
font-weight: 600;
}
.audio-badge.mic { background: rgba(76,175,136,0.2); color: var(--green); }
.audio-badge.sys { background: rgba(74,163,224,0.2); ...
|
NULL
|
|
1436
|
32
|
5
|
2026-04-11T17:27:53.652081+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928473652_m1.jpg...
|
Code
|
#!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73 #!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 16, Col 1
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null
Copy code to clipboard
OUT
Exit code 1
[rerun: b4]
Bash
Bootstrap pip then install packages
IN
python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10
Copy code to clipboard
OUT
Exit code 1
/usr/bin/python3: No module named ensurepip
[rerun: b5]
Bash
Install pip via apt
IN
apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
OUT
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
[rerun: b6]
Bash
Install pip with sudo
Reason:
lets make it in docker, not to install it in nas directly
IN
sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
Good call. Let me check what Docker setup you already have and build a proper containerized app.
Bash
Check existing docker-compose for reference
IN
ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30
Copy code to clipboard
OUT
consume
data
db
docker-compose.yml
export
mcp-server
media
redis
trash
services:
redis:
image: redis:8
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
security_opt:
- no-new-privileges:true
read_only: true
user: 1000:10
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- /volume2/docker/paperlessngx/redis:/data:rw
environment:
TZ: Europe/Sofia
restart: always
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
[rerun: b7]
Bash
Check Docker availability
IN
docker --version && docker compose version 2>/dev/null
Copy code to clipboard
OUT
Docker version 26.1.0, build 9714adc
Docker Compose version v2.26.1
[rerun: b8]
Bash
Create app directory structure
IN
mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static
Copy code to clipboard
OUT
[rerun: b9]
Now let me build everything. I'll create all the files:
Write
requirements.txt
requirements.txt
6 lines
fastapi==0.115.12
uvicorn[standard]==0.34.0
click==8.1.8
anthropic==0.49.0
python-dotenv==1.1.0
Write
Dockerfile
Dockerfile
13 lines
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "[IP_ADDRESS]", "--port", "8000"]
Write
db.py
db.py
28 lines
import sqlite3
from contextlib import contextmanager
from datetime import date, datetime, timedelta, timezone
from typing import Generator
DB_PATH = "/data/db.sqlite"
@contextmanager
def get_conn() -> Generator[sqlite3.Connection, None, None]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
yield conn
finally:
conn.close()
def date_range(for_date: date) -> tuple[str, str]:
"""Return ISO timestamps for start/end of a given date (UTC)."""
start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)
end = start + timedelta(days=1)
return start.isoformat(), end.isoformat()
def today() -> date:
return datetime.now(timezone.utc).date()
Write
__init__.py
__init__.py
1 line
Write
activity.py
activity.py
123 lines
"""App usage and window focus time consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def app_time(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per app for a given date, sorted descending."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
o.app_name,
COUNT(*) as frame_count,
-- each frame ~ 2s at 0.5fps; convert to minutes
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY o.app_name
ORDER BY frame_count DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per window/tab, optionally filtered by app."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
o.app_name,
o.window_name,
COUNT(*) as frame_count,
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
"""
params: list = [start, end]
if app:
query += " AND o.app_name = ?"
params.append(app)
query += " GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:
"""Return activity bucketed into N-minute intervals."""
d = for_date or _today()
start, end = date_range(d)
interval_sec = interval_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
COUNT(*) as frames
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY bucket, o.app_name
ORDER BY bucket, frames DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def summary_stats(for_date: date | None = None) -> dict[str, Any]:
"""Return high-level stats for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
frames_row = conn.execute(
"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last "
"FROM frames WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
app_count = conn.execute(
"""
SELECT COUNT(DISTINCT o.app_name) as n
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''
""",
(start, end),
).fetchone()
audio_count = conn.execute(
"SELECT COUNT(*) as n FROM audio_transcriptions "
"WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
return {
"date": str(d),
"total_frames": frames_row["n"],
"first_seen": frames_row["first"],
"last_seen": frames_row["last"],
"unique_apps": app_count["n"],
"audio_segments": audio_count["n"],
}
Write
ocr.py
ocr.py
92 lines
"""OCR text search and aggregation consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:
"""Full-text search OCR content."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
f.timestamp,
o.app_name,
o.window_name,
snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet
FROM ocr_text_fts
JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid
JOIN frames f ON o.frame_id = f.id
WHERE ocr_text_fts MATCH ?
AND f.timestamp >= ? AND f.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:
"""Return all OCR text for a date, optionally only focused windows."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
f.timestamp,
o.app_name,
o.window_name,
o.text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
"""
params: list = [start, end]
if focused_only:
query += " AND o.focused = TRUE"
query += " ORDER BY f.timestamp"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:
"""
Return OCR text deduplicated by time chunk + app to reduce LLM token usage.
Groups frames into N-minute buckets and returns one representative text per app per bucket.
"""
d = for_date or _today()
start, end = date_range(d)
interval_sec = chunk_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
o.window_name,
substr(o.text, 1, 500) as text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
GROUP BY bucket, o.app_name
ORDER BY bucket
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
Write
audio.py
audio.py
61 lines
"""Audio transcription consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return all audio transcriptions for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT timestamp, transcription, device, is_input_device, speaker_id
FROM audio_transcriptions
WHERE timestamp >= ? AND timestamp < ?
AND length(transcription) > 2
ORDER BY timestamp
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:
"""Search audio transcriptions."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
a.timestamp,
a.device,
snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet
FROM audio_transcriptions_fts
JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id
WHERE audio_transcriptions_fts MATCH ?
AND a.timestamp >= ? AND a.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def formatted_transcript(for_date: date | None = None) -> str:
"""Return audio as a readable transcript string."""
rows = transcriptions(for_date)
if not rows:
return "(no audio transcriptions)"
lines = []
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
lines.append(f"[{r['timestamp']}] [{label}] {r['transcription']}")
return "\n".join(lines)
Write
summary.py
summary.py
162 lines
"""AI summary generator using Claude."""
import os
from datetime import date
from typing import Any
from consumers.activity import app_time, summary_stats
from consumers.ocr import deduplicated_text
from consumers.audio import formatted_transcript
SUMMARY_TYPES = {
"day_recap": {
"title": "Day Recap",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a concise day recap using EXACTLY this format:
## Summary
One sentence: what I mainly worked on today.
## Accomplishments
- Top 3 things I finished, with approximate times
- Name specific apps, files, or projects
## Key Moments
- Important things seen or heard, with timestamps
## Unfinished Work
- What to continue tomorrow
## Patterns
- Apps used most, topics that came up repeatedly
Only report what you can verify from the data. End with:
**Next step:** [most important thing to continue]""",
},
"standup": {
"title": "Standup Update",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a brief standup update:
**Yesterday:** What I worked on (2-3 bullets)
**Today:** What I plan to continue (1-2 bullets)
**Blockers:** Any issues observed (or "None")
Keep it under 150 words. Only report what's verifiable from the data.""",
},
"focus_time": {
"title": "Focus & Distraction Analysis",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
Analyze focus vs distraction patterns:
## Deep Work Periods
- When and how long were sustained focus sessions?
- What was being worked on?
## Distractions
- Which apps/sites were used recreationally?
- How much time was lost to context switching?
## Recommendations
- 2-3 concrete suggestions to improve focus tomorrow
Be specific with times and app names.""",
},
}
def _build_context(for_date: date) -> dict[str, str]:
apps = app_time(for_date)
app_lines = "\n".join(f"- {a['app_name']}: {a['minutes']} min" for a in apps[:20])
ocr_rows = deduplicated_text(for_date, chunk_minutes=5)
ocr_lines = "\n".join(
f"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}"
for r in ocr_rows[:100]
)
audio = formatted_transcript(for_date)
return {
"app_time": app_lines or "(no app data)",
"ocr_text": ocr_lines or "(no screen data)",
"audio": audio[:3000] if len(audio) > 3000 else audio,
}
def generate(
summary_type: str = "day_recap",
for_date: date | None = None,
api_key: str | None = None,
) -> dict[str, Any]:
"""Generate an AI summary. Returns dict with 'title', 'content', 'date'."""
import anthropic
d = for_date or date.today()
key = api_key or os.environ.get("ANTHROPIC_API_KEY", "")
if not key:
return {
"title": "Error",
"content": "ANTHROPIC_API_KEY not set. Add it to your .env file.",
"date": str(d),
}
spec = SUMMARY_TYPES.get(summary_type)
if not spec:
return {"title": "Error", "content": f"Unknown summary type: {summary_type}", "date": str(d)}
stats = summary_stats(d)
if stats["total_frames"] == 0:
return {
"title": spec["title"],
"content": f"No screen data found for {d}.",
"date": str(d),
}
ctx = _build_context(d)
prompt = spec["prompt"].format(**ctx)
client = anthropic.Anthropic(api_key=key)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return {
"title": spec["title"],
"content": message.content[0].text,
"date": str(d),
"stats": stats,
}
Now the FastAPI backend and CLI:
Write
main.py
main.py
89 lines
"""Screenpipe dashboard — FastAPI web UI."""
import os
from datetime import date, datetime
from typing import Any
from dotenv import load_dotenv
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
load_dotenv()
from consumers.activity import app_time, window_time, timeline, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions, search as audio_search
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
app = FastAPI(title="Screenpipe Dashboard")
app.mount("/static", StaticFiles(directory="static"), name="static")
def _parse_date(d: str | None) -> date | None:
if not d:
return None
try:
return date.fromisoformat(d)
except ValueError:
return None
@app.get("/", response_class=HTMLResponse)
async def index():
with open("static/index.html") as f:
return f.read()
# ── Activity ──────────────────────────────────────────────────────────────────
@app.get("/api/stats")
async def stats(d: str | None = Query(None)):
return summary_stats(_parse_date(d))
@app.get("/api/activity/apps")
async def activity_apps(d: str | None = Query(None)):
return app_time(_parse_date(d))
@app.get("/api/activity/windows")
async def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):
return window_time(_parse_date(d), app_name)
@app.get("/api/activity/timeline")
async def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):
return timeline(_parse_date(d), interval)
# ── Search ───────────────────────────────────────────────────────────────────
@app.get("/api/search/ocr")
async def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):
return ocr_search(q, _parse_date(d), limit)
@app.get("/api/search/audio")
async def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):
return audio_search(q, _parse_date(d), limit)
# ── Audio ─────────────────────────────────────────────────────────────────────
@app.get("/api/audio")
async def audio(d: str | None = Query(None)):
return transcriptions(_parse_date(d))
# ── Summaries ─────────────────────────────────────────────────────────────────
@app.get("/api/summary/types")
async def summary_types():
return [{"id": k, "title": v["title"]} for k, v in SUMMARY_TYPES.items()]
@app.post("/api/summary/generate")
async def generate_summary(type: str = "day_recap", d: str | None = None):
result = gen_summary(type, _parse_date(d))
return result
Write
cli.py
cli.py
131 lines
#!/usr/bin/env python3
"""Screenpipe CLI — run summaries and reports on demand."""
import os
import sys
from datetime import date, timedelta
import click
from dotenv import load_dotenv
load_dotenv()
sys.path.insert(0, os.path.dirname(__file__))
from consumers.activity import app_time, window_time, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
def _resolve_date(d_str: str | None) -> date | None:
if not d_str:
return None
if d_str == "yesterday":
return date.today() - timedelta(days=1)
if d_str == "today":
return date.today()
return date.fromisoformat(d_str)
@click.group()
def cli():
"""Screenpipe data explorer and summariser."""
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--type", "-t", "summary_type", default="day_recap",
type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)
def summary(d, summary_type):
"""Generate an AI summary for a date (default: today)."""
target = _resolve_date(d)
click.echo(f"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...")
result = gen_summary(summary_type, target)
click.echo(f"\n{'─'*60}")
click.echo(f" {result['title']} — {result['date']}")
click.echo(f"{'─'*60}\n")
click.echo(result["content"])
if "stats" in result:
s = result["stats"]
click.echo(f"\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, "
f"{s['audio_segments']} audio segments]")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--app", "-a", default=None, help="Filter by app name")
@click.option("--windows", "-w", is_flag=True, help="Show window breakdown instead of apps")
def activity(d, app, windows):
"""Show time spent per app or window."""
target = _resolve_date(d)
label = str(target or date.today())
if windows or app:
rows = window_time(target, app)
click.echo(f"\nWindow time — {label}" + (f" [{app}]" if app else ""))
click.echo(f"{'App':<25} {'Window':<40} {'Min':>6}")
click.echo("─" * 75)
for r in rows:
click.echo(f"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}")
else:
rows = app_time(target)
stats = summary_stats(target)
click.echo(f"\nApp time — {label}")
click.echo(f"{'App':<30} {'Minutes':>8}")
click.echo("─" * 40)
for r in rows:
click.echo(f"{r['app_name']:<30} {r['minutes']:>8}")
click.echo(f"\nTotal frames: {stats['total_frames']} | "
f"Active: {stats['first_seen']} → {stats['last_seen']}")
@cli.command()
@click.argument("query")
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--audio", is_flag=True, help="Search audio instead of screen text")
@click.option("--limit", "-n", default=20, show_default=True)
def search(query, d, audio, limit):
"""Search OCR screen text or audio transcriptions."""
from consumers.audio import search as audio_search_fn
target = _resolve_date(d)
if audio:
rows = audio_search_fn(query, target, limit)
click.echo(f"\nAudio results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['snippet']}")
else:
rows = ocr_search(query, target, limit)
click.echo(f"\nOCR results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}")
click.echo(f" {r['snippet']}")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
def audio(d):
"""Show audio transcriptions for a date."""
target = _resolve_date(d)
rows = transcriptions(target)
if not rows:
click.echo("No audio transcriptions found.")
return
click.echo(f"\nAudio transcriptions — {target or date.today()}")
click.echo("─" * 60)
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
click.echo(f"[{r['timestamp']}] [{label}] {r['transcription']}")
@cli.command()
def serve():
"""Start the web UI (runs uvicorn on port 8000)."""
import uvicorn
click.echo("Starting Screenpipe dashboard at [URL_WITH_CREDENTIALS] (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
padding: 16px;
}
.card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }
.bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }
.bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }
.bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }
.bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }
td { padding: 6px 8px; border-bottom: 1px solid var(--border); }
tr:last-child td { border-bottom: none; }
tr:hover td { background: rgba(255,255,255,0.02); }
.timeline-wrap { overflow-x: auto; }
.timeline-grid { display: grid; gap: 2px; min-width: 600px; }
.tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }
.tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }
.tl-cell {
flex: 1;
height: 20px;
border-radius: 3px;
background: var(--border);
position: relative;
cursor: default;
font-size: 10px;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
color: white;
}
.summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
select {
background: var(--bg);
border: 1px solid var(--border);
color: var(--text);
padding: 6px 10px;
border-radius: 6px;
font-size: 13px;
}
button {
background: var(--accent);
color: white;
border: none;
padding: 8px 18px;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
font-weight: 500;
}
button:hover { opacity: 0.85; }
button:disabled { opacity: 0.4; cursor: default; }
.summary-output {
background: var(--bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 20px;
white-space: pre-wrap;
font-family: inherit;
line-height: 1.6;
min-height: 200px;
color: var(--text);
}
.summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }
.summary-output ul { padding-left: 20px; }
.summary-output strong { color: var(--accent2); }
.search-bar { display: flex; gap: 8px; margin-bottom: 16px; }
.search-bar input[type="text"] { flex: 1; }
.search-bar select { }
.result-item {
border-bottom: 1px solid var(--border);
padding: 10px 4px;
}
.result-item:last-child { border-bottom: none; }
.result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }
.result-snippet { font-size: 13px; }
.result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }
.audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }
.audio-item:last-child { border-bottom: none; }
.audio-badge {
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
flex-shrink: 0;
font-weight: 600;
}
...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Build screenpipe data UI…, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","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 16, Col 1","depth":16,"bounds":{"left":1.0,"top":0.0,"width":-0.052777767,"height":0.024444444},"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.93958336,"top":0.0,"width":0.06041664,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Build screenpipe data UI and summary app","depth":18,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"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":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Let me explore the screenpipe directory to understand what we're working with.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List screenpipe directory contents","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"data\ndb.sqlite\npipes\n#recycle\n[rerun: b1]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List data and pipes directories","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09\n2026-04-11\nai-habits\nday-recap\nmeeting-summary\nstandup-update\ntime-breakdown\nvideo-export\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List tables in screenpipe SQLite database","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \".tables\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx\n[rerun: b3]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get ocr_text table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(ocr_text);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|frame_id|INTEGER|1||0\n1|text|TEXT|1||0\n2|text_json|TEXT|0||0\n3|app_name|TEXT|1|''|0\n4|ocr_engine|TEXT|1|'unknown'|0\n5|window_name|TEXT|0||0\n6|focused|BOOLEAN|0|FALSE|0\n7|text_length|INTEGER|0||0\n8|sync_id|TEXT|0||0\n9|synced_at|DATETIME|0||0\n[rerun: b4]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get audio_transcriptions table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(audio_transcriptions);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|audio_chunk_id|INTEGER|1||0\n2|offset_index|INTEGER|1||0\n3|timestamp|TIMESTAMP|1||0\n4|transcription|TEXT|1||0\n5|device|TEXT|1|''|0\n6|is_input_device|BOOLEAN|1|TRUE|0\n7|speaker_id|INTEGER|0||0\n8|transcription_engine|TEXT|1|'Whisper'|0\n9|start_time|REAL|0||0\n10|end_time|REAL|0||0\n11|text_length|INTEGER|0||0\n12|sync_id|TEXT|0||0\n13|synced_at|DATETIME|0||0\n[rerun: b5]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get frames, ui_events, video_chunks schemas","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|video_chunk_id|INTEGER|0|NULL|0\n2|offset_index|INTEGER|1|0|0\n3|timestamp|TIMESTAMP|1||0\n4|name|TEXT|0||0\n5|app_name|TEXT|0|NULL|0\n6|window_name|TEXT|0|NULL|0\n7|focused|BOOLEAN|0|NULL|0\n8|browser_url|TEXT|0|NULL|0\n9|device_name|TEXT|1|''|0\n10|sync_id|TEXT|0||0\n11|machine_id|TEXT|0||0\n12|synced_at|DATETIME|0||0\n13|snapshot_path|TEXT|0|NULL|0\n14|accessibility_text|TEXT|0|NULL|0\n15|accessibility_tree_json|TEXT|0|NULL|0\n16|content_hash|INTEGER|0|NULL|0\n17|simhash|INTEGER|0|NULL|0\n18|capture_trigger|TEXT|0|NULL|0\n19|text_source|TEXT|0|NULL|0\n20|cloud_blob_id|TEXT|0|NULL|0\n21|full_text|TEXT|0|NULL|0\n22|elements_ref_frame_id|INTEGER|0|NULL|0\n0|id|INTEGER|0||1\n1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0\n2|session_id|TEXT|0||0\n3|relative_ms|INTEGER|1|0|0\n4|event_type|TEXT|1||0\n5|x|INTEGER|0||0\n6|y|INTEGER|0||0\n7|delta_x|INTEGER|0||0\n8|delta_y|INTEGER|0||0\n9|button|INTEGER|0||0\n10|click_count|INTEGER|0||0\n11|key_code|INTEGER|0||0\n12|modifiers|INTEGER|0||0\n13|text_content|TEXT|0||0\n14|text_length|INTEGER|0||0\n15|app_name|TEXT|0||0\n16|app_pid|INTEGER|0||0\n17|window_title|TEXT|0||0\n18|browser_url|TEXT|0||0\n19|element_role|TEXT|0||0\n20|element_name|TEXT|0||0\n21|element_value|TEXT|0||0\n22|element_description|TEXT|0||0\n23|element_automation_id|TEXT|0||0\n24|element_bounds|TEXT|0||0\n25|frame_id|INTEGER|0||0\n26|sync_id|TEXT|0||0\n27|machine_id|TEXT|0||0\n28|synced_at|DATETIME|0||0\n0|id|INTEGER|0||1\n1|file_path|TEXT|1||0\n2|device_name|TEXT|1|''|0\n3|sync_id|TEXT|0||0\n4|machine_id|TEXT|0||0\n5|synced_at|DATETIME|0||0\n6|fps|REAL|1|0.5|0\n7|cloud_blob_id|TEXT|0|NULL|0\n[rerun: b6]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check data counts and date ranges","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*) FROM ocr_text;\" 2>/dev/null","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00\n3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00\n666\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Explore existing pipes for patterns","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Read day-recap pipe documentation","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cat /volume1/screenpipe/pipes/day-recap/pipe.md","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"---\nschedule: manual\nenabled: true\ntemplate: true\ntitle: Day Recap\ndescription: \"Today's accomplishments, key moments, and unfinished work\"\nicon: \"📋\"\nfeatured: true\n---\n\nAnalyze my screen and audio recordings from today (last 16 hours only). \n\nRead screenpipe skill first.\n\nUse this exact format:\n\n## Summary\nOne sentence: what I mainly did today.\n\n## Accomplishments\n- Top 3 things I finished, with timestamps (e.g. \"2:30 PM\")\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things I saw, said, or heard — with timestamps\n\n## Unfinished Work\n- What I should continue tomorrow — name the app/file/task\n\n## Patterns\n- Apps I used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with: \"**Next step:** [most important thing to continue]\"\n[rerun: b9]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample app names from frames","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Safari\nActivity Monitor\nDia\niTerm2\nControl Centre\nUserNotificationCenter\nFinder\nClaude\nSlack\nFirefox\nRaycast\nNetAuthAgent\nQuickTime Player\n[rerun: b10]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample joined frame+ocr data for today","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE\n2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER\n2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p\n2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p\n2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample recent audio transcriptions","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09T17:02:52+00:00|.|System Audio\n2026-04-09T16:59:22+00:00|Class is technically...|System Audio\n2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio\n[rerun: b12]","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Good data to work with. Here's what we have:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ocr_text","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Screen captures with OCR text, app name, window name (1135 frames so far)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"audio_transcriptions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Voice/system audio transcripts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ui_events","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Mouse/keyboard events with app context","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Raw video files","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Before I start building, a few quick questions:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Tech stack","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"AI summaries","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"What summaries matter most?","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Day recap (what apps/windows you used, key text seen)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"App time breakdown (time per app)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Audio/conversation recap","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Custom searchable timeline","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Here's the architecture I'm thinking:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"/volume1/screenpipe/app/\n├── main.py # FastAPI web UI\n├── cli.py # Click CLI: `python cli.py day-recap`\n├── db.py # Read-only queries against db.sqlite\n├── consumers/\n│ ├── activity.py # App usage, time per window\n│ ├── ocr.py # OCR text aggregation + search\n│ ├── audio.py # Transcription queries\n│ └── summary.py # AI summary builder\n└── static/\n └── index.html # Single-page UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"CLI commands would look like:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"python cli.py day-recap # EOD summary\npython cli.py activity --date today # App time breakdown\npython cli.py search \"docker\" # Search OCR/audio text\npython cli.py serve # Launch web UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Does this direction work? Any preferences on the stack or which summaries to prioritize?","depth":22,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"seesm ok","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Python and available packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 --version && pip3 list 2>/dev/null | grep -E \"fastapi|uvicorn|click|anthropic|httpx|jinja\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Python 3.11.2\n[rerun: b1]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Verify join works for today's data","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"\nSELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len\nFROM frames f JOIN ocr_text o ON f.id = o.frame_id\nWHERE DATE(f.timestamp) = '2026-04-11'\nORDER BY f.timestamp DESC LIMIT 3;\n\"","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T12:54:42.597794+00:00|||2111\n2026-04-11T12:54:41.915916+00:00|||2110\n2026-04-11T12:54:39.912712+00:00|||2111\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install required packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"/bin/bash: line 1: pip3: command not found\n[rerun: b3]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Find pip","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"which pip || which pip3 || python3 -m pip --version 2>/dev/null","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\n[rerun: b4]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bootstrap pip then install packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\n/usr/bin/python3: No module named ensurepip\n[rerun: b5]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install pip via apt","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"apt-get install -y python3-pip python3-venv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)\nE: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?\n[rerun: b6]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install pip with sudo","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Reason:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"lets make it in docker, not to install it in nas directly","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Good call. Let me check what Docker setup you already have and build a proper containerized app.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check existing docker-compose for reference","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"consume\ndata\ndb\ndocker-compose.yml\nexport\nmcp-server\nmedia\nredis\ntrash\nservices:\n redis:\n image: redis:8\n command:\n - /bin/sh\n - -c\n - redis-server --requirepass redispass\n container_name: PaperlessNGX-REDIS\n hostname: paper-redis\n security_opt:\n - no-new-privileges:true\n read_only: true\n user: 1000:10\n healthcheck:\n test: [\"CMD-SHELL\", \"redis-cli ping || exit 1\"]\n volumes:\n - /volume2/docker/paperlessngx/redis:/data:rw\n environment:\n TZ: Europe/Sofia\n restart: always\n\n db:\n image: postgres:17\n container_name: PaperlessNGX-DB\n hostname: paper-db\n mem_limit: 1g\n security_opt:\n - no-new-privileges:true\n healthcheck:\n test: [\"CMD\", \"pg_isready\", \"-q\", \"-d\", \"paperless\", \"-U\", \"paperlessuser\"]\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Docker availability","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"docker --version && docker compose version 2>/dev/null","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Docker version 26.1.0, build 9714adc\nDocker Compose version v2.26.1\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Create app directory structure","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"[rerun: b9]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Now let me build everything. I'll create all the files:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"requirements.txt","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"requirements.txt","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"6 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"fastapi==0.115.12\nuvicorn[standard]==0.34.0\nclick==8.1.8\nanthropic==0.49.0\npython-dotenv==1.1.0","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"13 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"FROM python:3.12-slim\n\nWORKDIR /app\n\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY . .\n\nEXPOSE 8000\n\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"db.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"db.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"28 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"import sqlite3\nfrom contextlib import contextmanager\nfrom datetime import date, datetime, timedelta, timezone\nfrom typing import Generator\n\nDB_PATH = \"/data/db.sqlite\"\n\n\n@contextmanager\ndef get_conn() -> Generator[sqlite3.Connection, None, None]:\n conn = sqlite3.connect(f\"file:{DB_PATH}?mode=ro\", uri=True)\n conn.row_factory = sqlite3.Row\n try:\n yield conn\n finally:\n conn.close()\n\n\ndef date_range(for_date: date) -> tuple[str, str]:\n \"\"\"Return ISO timestamps for start/end of a given date (UTC).\"\"\"\n start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)\n end = start + timedelta(days=1)\n return start.isoformat(), end.isoformat()\n\n\ndef today() -> date:\n return datetime.now(timezone.utc).date()","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"__init__.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"__init__.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1 line","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"activity.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"activity.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"123 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"App usage and window focus time consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef app_time(for_date: date | None = None) -> list[dict[str, Any]]:\n \"\"\"Return minutes spent per app for a given date, sorted descending.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n o.app_name,\n COUNT(*) as frame_count,\n -- each frame ~ 2s at 0.5fps; convert to minutes\n ROUND(COUNT(*) * 2.0 / 60, 1) as minutes\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n GROUP BY o.app_name\n ORDER BY frame_count DESC\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:\n \"\"\"Return minutes spent per window/tab, optionally filtered by app.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n query = \"\"\"\n SELECT\n o.app_name,\n o.window_name,\n COUNT(*) as frame_count,\n ROUND(COUNT(*) * 2.0 / 60, 1) as minutes\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n \"\"\"\n params: list = [start, end]\n if app:\n query += \" AND o.app_name = ?\"\n params.append(app)\n query += \" GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50\"\n\n with get_conn() as conn:\n rows = conn.execute(query, params).fetchall()\n return [dict(r) for r in rows]\n\n\ndef timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:\n \"\"\"Return activity bucketed into N-minute intervals.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n interval_sec = interval_minutes * 60\n\n with get_conn() as conn:\n rows = conn.execute(\n f\"\"\"\n SELECT\n datetime(\n (strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},\n 'unixepoch'\n ) as bucket,\n o.app_name,\n COUNT(*) as frames\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n GROUP BY bucket, o.app_name\n ORDER BY bucket, frames DESC\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef summary_stats(for_date: date | None = None) -> dict[str, Any]:\n \"\"\"Return high-level stats for a date.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n frames_row = conn.execute(\n \"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last \"\n \"FROM frames WHERE timestamp >= ? AND timestamp < ?\",\n (start, end),\n ).fetchone()\n\n app_count = conn.execute(\n \"\"\"\n SELECT COUNT(DISTINCT o.app_name) as n\n FROM frames f JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''\n \"\"\",\n (start, end),\n ).fetchone()\n\n audio_count = conn.execute(\n \"SELECT COUNT(*) as n FROM audio_transcriptions \"\n \"WHERE timestamp >= ? AND timestamp < ?\",\n (start, end),\n ).fetchone()\n\n return {\n \"date\": str(d),\n \"total_frames\": frames_row[\"n\"],\n \"first_seen\": frames_row[\"first\"],\n \"last_seen\": frames_row[\"last\"],\n \"unique_apps\": app_count[\"n\"],\n \"audio_segments\": audio_count[\"n\"],\n }","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"ocr.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ocr.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"92 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"OCR text search and aggregation consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:\n \"\"\"Full-text search OCR content.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n f.timestamp,\n o.app_name,\n o.window_name,\n snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet\n FROM ocr_text_fts\n JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid\n JOIN frames f ON o.frame_id = f.id\n WHERE ocr_text_fts MATCH ?\n AND f.timestamp >= ? AND f.timestamp < ?\n ORDER BY rank\n LIMIT ?\n \"\"\",\n (query, start, end, limit),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:\n \"\"\"Return all OCR text for a date, optionally only focused windows.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n query = \"\"\"\n SELECT\n f.timestamp,\n o.app_name,\n o.window_name,\n o.text\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n AND length(o.text) > 20\n \"\"\"\n params: list = [start, end]\n if focused_only:\n query += \" AND o.focused = TRUE\"\n query += \" ORDER BY f.timestamp\"\n\n with get_conn() as conn:\n rows = conn.execute(query, params).fetchall()\n return [dict(r) for r in rows]\n\n\ndef deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:\n \"\"\"\n Return OCR text deduplicated by time chunk + app to reduce LLM token usage.\n Groups frames into N-minute buckets and returns one representative text per app per bucket.\n \"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n interval_sec = chunk_minutes * 60\n\n with get_conn() as conn:\n rows = conn.execute(\n f\"\"\"\n SELECT\n datetime(\n (strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},\n 'unixepoch'\n ) as bucket,\n o.app_name,\n o.window_name,\n substr(o.text, 1, 500) as text\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n AND length(o.text) > 20\n GROUP BY bucket, o.app_name\n ORDER BY bucket\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"audio.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"audio.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"61 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"Audio transcription consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:\n \"\"\"Return all audio transcriptions for a date.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT timestamp, transcription, device, is_input_device, speaker_id\n FROM audio_transcriptions\n WHERE timestamp >= ? AND timestamp < ?\n AND length(transcription) > 2\n ORDER BY timestamp\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:\n \"\"\"Search audio transcriptions.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n a.timestamp,\n a.device,\n snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet\n FROM audio_transcriptions_fts\n JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id\n WHERE audio_transcriptions_fts MATCH ?\n AND a.timestamp >= ? AND a.timestamp < ?\n ORDER BY rank\n LIMIT ?\n \"\"\",\n (query, start, end, limit),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef formatted_transcript(for_date: date | None = None) -> str:\n \"\"\"Return audio as a readable transcript string.\"\"\"\n rows = transcriptions(for_date)\n if not rows:\n return \"(no audio transcriptions)\"\n lines = []\n for r in rows:\n label = \"MIC\" if r[\"is_input_device\"] else \"SYS\"\n lines.append(f\"[{r['timestamp']}] [{label}] {r['transcription']}\")\n return \"\\n\".join(lines)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"summary.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"summary.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"162 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"AI summary generator using Claude.\"\"\"\nimport os\nfrom datetime import date\nfrom typing import Any\n\nfrom consumers.activity import app_time, summary_stats\nfrom consumers.ocr import deduplicated_text\nfrom consumers.audio import formatted_transcript\n\n\nSUMMARY_TYPES = {\n \"day_recap\": {\n \"title\": \"Day Recap\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\n## Audio/speech:\n{audio}\n\nWrite a concise day recap using EXACTLY this format:\n\n## Summary\nOne sentence: what I mainly worked on today.\n\n## Accomplishments\n- Top 3 things I finished, with approximate times\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things seen or heard, with timestamps\n\n## Unfinished Work\n- What to continue tomorrow\n\n## Patterns\n- Apps used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with:\n**Next step:** [most important thing to continue]\"\"\",\n },\n \"standup\": {\n \"title\": \"Standup Update\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\n## Audio/speech:\n{audio}\n\nWrite a brief standup update:\n\n**Yesterday:** What I worked on (2-3 bullets)\n**Today:** What I plan to continue (1-2 bullets)\n**Blockers:** Any issues observed (or \"None\")\n\nKeep it under 150 words. Only report what's verifiable from the data.\"\"\",\n },\n \"focus_time\": {\n \"title\": \"Focus & Distraction Analysis\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\nAnalyze focus vs distraction patterns:\n\n## Deep Work Periods\n- When and how long were sustained focus sessions?\n- What was being worked on?\n\n## Distractions\n- Which apps/sites were used recreationally?\n- How much time was lost to context switching?\n\n## Recommendations\n- 2-3 concrete suggestions to improve focus tomorrow\n\nBe specific with times and app names.\"\"\",\n },\n}\n\n\ndef _build_context(for_date: date) -> dict[str, str]:\n apps = app_time(for_date)\n app_lines = \"\\n\".join(f\"- {a['app_name']}: {a['minutes']} min\" for a in apps[:20])\n\n ocr_rows = deduplicated_text(for_date, chunk_minutes=5)\n ocr_lines = \"\\n\".join(\n f\"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}\"\n for r in ocr_rows[:100]\n )\n\n audio = formatted_transcript(for_date)\n\n return {\n \"app_time\": app_lines or \"(no app data)\",\n \"ocr_text\": ocr_lines or \"(no screen data)\",\n \"audio\": audio[:3000] if len(audio) > 3000 else audio,\n }\n\n\ndef generate(\n summary_type: str = \"day_recap\",\n for_date: date | None = None,\n api_key: str | None = None,\n) -> dict[str, Any]:\n \"\"\"Generate an AI summary. Returns dict with 'title', 'content', 'date'.\"\"\"\n import anthropic\n\n d = for_date or date.today()\n key = api_key or os.environ.get(\"ANTHROPIC_API_KEY\", \"\")\n if not key:\n return {\n \"title\": \"Error\",\n \"content\": \"ANTHROPIC_API_KEY not set. Add it to your .env file.\",\n \"date\": str(d),\n }\n\n spec = SUMMARY_TYPES.get(summary_type)\n if not spec:\n return {\"title\": \"Error\", \"content\": f\"Unknown summary type: {summary_type}\", \"date\": str(d)}\n\n stats = summary_stats(d)\n if stats[\"total_frames\"] == 0:\n return {\n \"title\": spec[\"title\"],\n \"content\": f\"No screen data found for {d}.\",\n \"date\": str(d),\n }\n\n ctx = _build_context(d)\n prompt = spec[\"prompt\"].format(**ctx)\n\n client = anthropic.Anthropic(api_key=key)\n message = client.messages.create(\n model=\"claude-opus-4-6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": prompt}],\n )\n\n return {\n \"title\": spec[\"title\"],\n \"content\": message.content[0].text,\n \"date\": str(d),\n \"stats\": stats,\n }","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the FastAPI backend and CLI:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"main.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"89 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"Screenpipe dashboard — FastAPI web UI.\"\"\"\nimport os\nfrom datetime import date, datetime\nfrom typing import Any\n\nfrom dotenv import load_dotenv\nfrom fastapi import FastAPI, Query\nfrom fastapi.responses import HTMLResponse, JSONResponse\nfrom fastapi.staticfiles import StaticFiles\n\nload_dotenv()\n\nfrom consumers.activity import app_time, window_time, timeline, summary_stats\nfrom consumers.ocr import search as ocr_search\nfrom consumers.audio import transcriptions, search as audio_search\nfrom consumers.summary import generate as gen_summary, SUMMARY_TYPES\n\napp = FastAPI(title=\"Screenpipe Dashboard\")\napp.mount(\"/static\", StaticFiles(directory=\"static\"), name=\"static\")\n\n\ndef _parse_date(d: str | None) -> date | None:\n if not d:\n return None\n try:\n return date.fromisoformat(d)\n except ValueError:\n return None\n\n\n@app.get(\"/\", response_class=HTMLResponse)\nasync def index():\n with open(\"static/index.html\") as f:\n return f.read()\n\n\n# ── Activity ──────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/stats\")\nasync def stats(d: str | None = Query(None)):\n return summary_stats(_parse_date(d))\n\n\n@app.get(\"/api/activity/apps\")\nasync def activity_apps(d: str | None = Query(None)):\n return app_time(_parse_date(d))\n\n\n@app.get(\"/api/activity/windows\")\nasync def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):\n return window_time(_parse_date(d), app_name)\n\n\n@app.get(\"/api/activity/timeline\")\nasync def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):\n return timeline(_parse_date(d), interval)\n\n\n# ── Search ───────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/search/ocr\")\nasync def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):\n return ocr_search(q, _parse_date(d), limit)\n\n\n@app.get(\"/api/search/audio\")\nasync def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):\n return audio_search(q, _parse_date(d), limit)\n\n\n# ── Audio ─────────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/audio\")\nasync def audio(d: str | None = Query(None)):\n return transcriptions(_parse_date(d))\n\n\n# ── Summaries ─────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/summary/types\")\nasync def summary_types():\n return [{\"id\": k, \"title\": v[\"title\"]} for k, v in SUMMARY_TYPES.items()]\n\n\n@app.post(\"/api/summary/generate\")\nasync def generate_summary(type: str = \"day_recap\", d: str | None = None):\n result = gen_summary(type, _parse_date(d))\n return result","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"cli.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"cli.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"131 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"#!/usr/bin/env python3\n\"\"\"Screenpipe CLI — run summaries and reports on demand.\"\"\"\nimport os\nimport sys\nfrom datetime import date, timedelta\n\nimport click\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nsys.path.insert(0, os.path.dirname(__file__))\n\nfrom consumers.activity import app_time, window_time, summary_stats\nfrom consumers.ocr import search as ocr_search\nfrom consumers.audio import transcriptions\nfrom consumers.summary import generate as gen_summary, SUMMARY_TYPES\n\n\ndef _resolve_date(d_str: str | None) -> date | None:\n if not d_str:\n return None\n if d_str == \"yesterday\":\n return date.today() - timedelta(days=1)\n if d_str == \"today\":\n return date.today()\n return date.fromisoformat(d_str)\n\n\n@click.group()\ndef cli():\n \"\"\"Screenpipe data explorer and summariser.\"\"\"\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--type\", \"-t\", \"summary_type\", default=\"day_recap\",\n type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)\ndef summary(d, summary_type):\n \"\"\"Generate an AI summary for a date (default: today).\"\"\"\n target = _resolve_date(d)\n click.echo(f\"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...\")\n result = gen_summary(summary_type, target)\n click.echo(f\"\\n{'─'*60}\")\n click.echo(f\" {result['title']} — {result['date']}\")\n click.echo(f\"{'─'*60}\\n\")\n click.echo(result[\"content\"])\n if \"stats\" in result:\n s = result[\"stats\"]\n click.echo(f\"\\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, \"\n f\"{s['audio_segments']} audio segments]\")\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--app\", \"-a\", default=None, help=\"Filter by app name\")\n@click.option(\"--windows\", \"-w\", is_flag=True, help=\"Show window breakdown instead of apps\")\ndef activity(d, app, windows):\n \"\"\"Show time spent per app or window.\"\"\"\n target = _resolve_date(d)\n label = str(target or date.today())\n\n if windows or app:\n rows = window_time(target, app)\n click.echo(f\"\\nWindow time — {label}\" + (f\" [{app}]\" if app else \"\"))\n click.echo(f\"{'App':<25} {'Window':<40} {'Min':>6}\")\n click.echo(\"─\" * 75)\n for r in rows:\n click.echo(f\"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}\")\n else:\n rows = app_time(target)\n stats = summary_stats(target)\n click.echo(f\"\\nApp time — {label}\")\n click.echo(f\"{'App':<30} {'Minutes':>8}\")\n click.echo(\"─\" * 40)\n for r in rows:\n click.echo(f\"{r['app_name']:<30} {r['minutes']:>8}\")\n click.echo(f\"\\nTotal frames: {stats['total_frames']} | \"\n f\"Active: {stats['first_seen']} → {stats['last_seen']}\")\n\n\n@cli.command()\n@click.argument(\"query\")\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--audio\", is_flag=True, help=\"Search audio instead of screen text\")\n@click.option(\"--limit\", \"-n\", default=20, show_default=True)\ndef search(query, d, audio, limit):\n \"\"\"Search OCR screen text or audio transcriptions.\"\"\"\n from consumers.audio import search as audio_search_fn\n\n target = _resolve_date(d)\n if audio:\n rows = audio_search_fn(query, target, limit)\n click.echo(f\"\\nAudio results for '{query}':\")\n for r in rows:\n click.echo(f\" [{r['timestamp']}] {r['snippet']}\")\n else:\n rows = ocr_search(query, target, limit)\n click.echo(f\"\\nOCR results for '{query}':\")\n for r in rows:\n click.echo(f\" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}\")\n click.echo(f\" {r['snippet']}\")\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\ndef audio(d):\n \"\"\"Show audio transcriptions for a date.\"\"\"\n target = _resolve_date(d)\n rows = transcriptions(target)\n if not rows:\n click.echo(\"No audio transcriptions found.\")\n return\n click.echo(f\"\\nAudio transcriptions — {target or date.today()}\")\n click.echo(\"─\" * 60)\n for r in rows:\n label = \"MIC\" if r[\"is_input_device\"] else \"SYS\"\n click.echo(f\"[{r['timestamp']}] [{label}] {r['transcription']}\")\n\n\n@cli.command()\ndef serve():\n \"\"\"Start the web UI (runs uvicorn on port 8000).\"\"\"\n import uvicorn\n click.echo(\"Starting Screenpipe dashboard at http://localhost:8000\")\n uvicorn.run(\"main:app\", host=\"0.0.0.0\", port=8000, reload=False)\n\n\nif __name__ == \"__main__\":\n cli()","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the frontend:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"438 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Screenpipe Dashboard</title>\n<style>\n :root {\n --bg: #0f0f11;\n --surface: #1a1a1f;\n --border: #2a2a35;\n --accent: #7c6fcd;\n --accent2: #4fa3e0;\n --text: #e0e0e8;\n --muted: #888899;\n --green: #4caf88;\n --red: #e06060;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { background: var(--bg); color: var(--text); font-family: 'Segoe UI', system-ui, sans-serif; font-size: 14px; }\n\n header {\n background: var(--surface);\n border-bottom: 1px solid var(--border);\n padding: 12px 24px;\n display: flex;\n align-items: center;\n gap: 16px;\n position: sticky;\n top: 0;\n z-index: 100;\n }\n header h1 { font-size: 16px; font-weight: 600; color: var(--accent); }\n header .spacer { flex: 1; }\n\n .date-picker { display: flex; align-items: center; gap: 8px; }\n .date-picker label { color: var(--muted); font-size: 12px; }\n input[type=\"date\"] {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 13px;\n }\n input[type=\"text\"] {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 13px;\n width: 200px;\n }\n input[type=\"text\"]:focus, input[type=\"date\"]:focus { outline: 1px solid var(--accent); }\n\n .tabs { display: flex; gap: 4px; }\n .tab {\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n color: var(--muted);\n font-size: 13px;\n border: 1px solid transparent;\n background: none;\n }\n .tab.active { background: var(--accent); color: white; }\n .tab:hover:not(.active) { background: var(--border); color: var(--text); }\n\n main { padding: 20px 24px; max-width: 1200px; margin: 0 auto; }\n\n .page { display: none; }\n .page.active { display: block; }\n\n .stats-bar {\n display: flex;\n gap: 16px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n }\n .stat-card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 12px 16px;\n flex: 1;\n min-width: 150px;\n }\n .stat-card .label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; }\n .stat-card .value { font-size: 22px; font-weight: 700; color: var(--accent); margin-top: 4px; }\n .stat-card .sub { color: var(--muted); font-size: 11px; margin-top: 2px; }\n\n .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n @media (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }\n\n .card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 10px;\n padding: 16px;\n }\n .card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }\n\n .bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }\n .bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }\n .bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }\n .bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }\n .bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }\n\n table { width: 100%; border-collapse: collapse; font-size: 13px; }\n th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }\n td { padding: 6px 8px; border-bottom: 1px solid var(--border); }\n tr:last-child td { border-bottom: none; }\n tr:hover td { background: rgba(255,255,255,0.02); }\n\n .timeline-wrap { overflow-x: auto; }\n .timeline-grid { display: grid; gap: 2px; min-width: 600px; }\n .tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }\n .tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }\n .tl-cell {\n flex: 1;\n height: 20px;\n border-radius: 3px;\n background: var(--border);\n position: relative;\n cursor: default;\n font-size: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n color: white;\n }\n\n .summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }\n select {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 13px;\n }\n button {\n background: var(--accent);\n color: white;\n border: none;\n padding: 8px 18px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n }\n button:hover { opacity: 0.85; }\n button:disabled { opacity: 0.4; cursor: default; }\n\n .summary-output {\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 20px;\n white-space: pre-wrap;\n font-family: inherit;\n line-height: 1.6;\n min-height: 200px;\n color: var(--text);\n }\n .summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }\n .summary-output ul { padding-left: 20px; }\n .summary-output strong { color: var(--accent2); }\n\n .search-bar { display: flex; gap: 8px; margin-bottom: 16px; }\n .search-bar input[type=\"text\"] { flex: 1; }\n .search-bar select { }\n\n .result-item {\n border-bottom: 1px solid var(--border);\n padding: 10px 4px;\n }\n .result-item:last-child { border-bottom: none; }\n .result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }\n .result-snippet { font-size: 13px; }\n .result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }\n\n .audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }\n .audio-item:last-child { border-bottom: none; }\n .audio-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 4px;\n flex-shrink: 0;\n font-weight: 600;\n }\n .audio-badge.mic { background: rgba(76,175,136,0.2); color: var(--green); }\n .audio-badge.sys { background: rgba(74,163,224,0.2); color: var(--accent2); }\n .audio-ts { color: var(--muted); font-size: 11px; flex-shrink: 0; }\n\n .spinner { display: inline-block; width: 14px; height: 14px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.7s linear infinite; vertical-align: middle; margin-right: 6px; }\n @keyframes spin { to { transform: rotate(360deg); } }\n\n .empty { color: var(--muted); text-align: center; padding: 40px; font-size: 13px; }\n</style>\n</head>\n<body>\n\n<header>\n <h1>Screenpipe</h1>\n <div class=\"tabs\">\n <button class=\"tab active\" onclick=\"showPage('activity')\">Activity</button>\n <button class=\"tab\" onclick=\"showPage('search')\">Search</button>\n <button class=\"tab\" onclick=\"showPage('audio')\">Audio</button>\n <button class=\"tab\" onclick=\"showPage('summary')\">Summary</button>\n </div>\n <div class=\"spacer\"></div>\n <div class=\"date-picker\">\n <label>Date</label>\n <input type=\"date\" id=\"datePicker\" onchange=\"refresh()\">\n </div>\n</header>\n\n<main>\n\n<!-- ── Activity ─────────────────────────────────────────────── -->\n<div class=\"page active\" id=\"page-activity\">\n <div class=\"stats-bar\" id=\"statsBar\">\n <div class=\"stat-card\"><div class=\"label\">Frames</div><div class=\"value\" id=\"st-frames\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Apps</div><div class=\"value\" id=\"st-apps\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Audio Segs</div><div class=\"value\" id=\"st-audio\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Active</div><div class=\"value\" id=\"st-first\" style=\"font-size:13px;margin-top:6px\">–</div><div class=\"sub\" id=\"st-last\">–</div></div>\n </div>\n <div class=\"grid-2\">\n <div class=\"card\">\n <h2>Time per App</h2>\n <div id=\"appBars\"><div class=\"empty\">Loading...</div></div>\n </div>\n <div class=\"card\">\n <h2>Windows</h2>\n <div id=\"windowTable\"><div class=\"empty\">Click an app bar to filter</div></div>\n </div>\n </div>\n</div>\n\n<!-- ── Search ───────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-search\">\n <div class=\"search-bar\">\n <input type=\"text\" id=\"searchQuery\" placeholder=\"Search screen text...\" onkeydown=\"if(event.key==='Enter') runSearch()\">\n <select id=\"searchTarget\">\n <option value=\"ocr\">Screen (OCR)</option>\n <option value=\"audio\">Audio</option>\n </select>\n <button onclick=\"runSearch()\">Search</button>\n </div>\n <div class=\"card\">\n <div id=\"searchResults\"><div class=\"empty\">Enter a query above to search screen text or audio transcriptions.</div></div>\n </div>\n</div>\n\n<!-- ── Audio ────────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-audio\">\n <div class=\"card\">\n <h2>Audio Transcriptions</h2>\n <div id=\"audioList\"><div class=\"empty\">Loading...</div></div>\n </div>\n</div>\n\n<!-- ── Summary ──────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-summary\">\n <div class=\"summary-controls\">\n <select id=\"summaryType\">\n <option value=\"day_recap\">Day Recap</option>\n <option value=\"standup\">Standup Update</option>\n <option value=\"focus_time\">Focus Analysis</option>\n </select>\n <button id=\"genBtn\" onclick=\"generateSummary()\">Generate</button>\n </div>\n <div class=\"summary-output\" id=\"summaryOutput\">\n Select a summary type and click Generate. Requires ANTHROPIC_API_KEY in your environment.\n </div>\n</div>\n\n</main>\n\n<script>\nconst API = '';\nlet currentPage = 'activity';\nlet currentApp = null;\n\n// ── Date ────────────────────────────────────────────────────────\nconst dp = document.getElementById('datePicker');\ndp.value = new Date().toISOString().slice(0, 10);\nfunction getDate() { return dp.value; }\n\nfunction refresh() {\n if (currentPage === 'activity') loadActivity();\n if (currentPage === 'audio') loadAudio();\n}\n\n// ── Page nav ────────────────────────────────────────────────────\nfunction showPage(name) {\n document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));\n document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));\n document.getElementById('page-' + name).classList.add('active');\n document.querySelectorAll('.tab')[['activity','search','audio','summary'].indexOf(name)].classList.add('active');\n currentPage = name;\n if (name === 'activity') loadActivity();\n if (name === 'audio') loadAudio();\n}\n\n// ── Activity ────────────────────────────────────────────────────\nasync function loadActivity() {\n const d = getDate();\n const [stats, apps] = await Promise.all([\n fetch(`${API}/api/stats?d=${d}`).then(r => r.json()),\n fetch(`${API}/api/activity/apps?d=${d}`).then(r => r.json()),\n ]);\n\n document.getElementById('st-frames').textContent = stats.total_frames ?? '–';\n document.getElementById('st-apps').textContent = stats.unique_apps ?? '–';\n document.getElementById('st-audio').textContent = stats.audio_segments ?? '–';\n document.getElementById('st-first').textContent = stats.first_seen ? fmtTime(stats.first_seen) : '–';\n document.getElementById('st-last').textContent = stats.last_seen ? '→ ' + fmtTime(stats.last_seen) : '';\n\n const max = apps[0]?.minutes || 1;\n const barsEl = document.getElementById('appBars');\n if (!apps.length) { barsEl.innerHTML = '<div class=\"empty\">No data</div>'; return; }\n\n barsEl.innerHTML = apps.slice(0, 20).map(a => `\n <div class=\"bar-item\" onclick=\"loadWindows('${esc(a.app_name)}')\" style=\"cursor:pointer\" title=\"Click to filter windows\">\n <div class=\"name\" title=\"${esc(a.app_name)}\">${esc(a.app_name)}</div>\n <div class=\"bar-wrap\"><div class=\"bar-fill\" style=\"width:${(a.minutes/max*100).toFixed(1)}%\"></div></div>\n <div class=\"mins\">${a.minutes}m</div>\n </div>`).join('');\n\n loadWindows(null);\n}\n\nasync function loadWindows(app) {\n currentApp = app;\n const d = getDate();\n const url = app ? `/api/activity/windows?d=${d}&app_name=${encodeURIComponent(app)}` : `/api/activity/windows?d=${d}`;\n const rows = await fetch(url).then(r => r.json());\n const el = document.getElementById('windowTable');\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No data</div>'; return; }\n el.innerHTML = `<table>\n <thead><tr><th>App</th><th>Window</th><th>Min</th></tr></thead>\n <tbody>${rows.slice(0,30).map(r => `\n <tr><td>${esc(r.app_name)}</td><td title=\"${esc(r.window_name||'')}\">${esc((r.window_name||'').slice(0,50))}</td><td>${r.minutes}</td></tr>\n `).join('')}</tbody>\n </table>`;\n}\n\n// ── Search ──────────────────────────────────────────────────────\nasync function runSearch() {\n const q = document.getElementById('searchQuery').value.trim();\n if (!q) return;\n const target = document.getElementById('searchTarget').value;\n const d = getDate();\n const el = document.getElementById('searchResults');\n el.innerHTML = '<div class=\"empty\"><span class=\"spinner\"></span>Searching...</div>';\n\n const url = target === 'audio'\n ? `/api/search/audio?q=${encodeURIComponent(q)}&d=${d}`\n : `/api/search/ocr?q=${encodeURIComponent(q)}&d=${d}`;\n\n const rows = await fetch(url).then(r => r.json()).catch(() => []);\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No results found.</div>'; return; }\n\n el.innerHTML = rows.map(r => `\n <div class=\"result-item\">\n <div class=\"result-meta\">${r.timestamp ? fmtTime(r.timestamp) : ''} · ${esc(r.app_name||'')} ${r.window_name ? '/ ' + esc(r.window_name) : ''}</div>\n <div class=\"result-snippet\">${highlightSnippet(r.snippet||'')}</div>\n </div>`).join('');\n}\n\nfunction highlightSnippet(s) {\n return esc(s).replace(/\\[/g, '<mark>').replace(/\\]/g, '</mark>');\n}\n\n// ── Audio ───────────────────────────────────────────────────────\nasync function loadAudio() {\n const d = getDate();\n const rows = await fetch(`${API}/api/audio?d=${d}`).then(r => r.json());\n const el = document.getElementById('audioList');\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No audio transcriptions for this date.</div>'; return; }\n el.innerHTML = rows.map(r => `\n <div class=\"audio-item\">\n <span class=\"audio-ts\">${fmtTime(r.timestamp)}</span>\n <span class=\"audio-badge ${r.is_input_device ? 'mic' : 'sys'}\">${r.is_input_device ? 'MIC' : 'SYS'}</span>\n <span>${esc(r.transcription)}</span>\n </div>`).join('');\n}\n\n// ── Summary ─────────────────────────────────────────────────────\nasync function generateSummary() {\n const type = document.getElementById('summaryType').value;\n const d = getDate();\n const btn = document.getElementById('genBtn');\n const out = document.getElementById('summaryOutput');\n btn.disabled = true;\n btn.innerHTML = '<span class=\"spinner\"></span>Generating...';\n out.textContent = 'Sending data to Claude...';\n\n const res = await fetch(`/api/summary/generate?type=${type}&d=${d}`, { method: 'POST' })\n .then(r => r.json()).catch(e => ({ content: 'Error: ' + e.message }));\n\n out.innerHTML = renderMarkdown(res.content || res.error || 'No content');\n btn.disabled = false;\n btn.textContent = 'Generate';\n}\n\n// ── Helpers ─────────────────────────────────────────────────────\nfunction esc(s) {\n return String(s||'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');\n}\n\nfunction fmtTime(ts) {\n if (!ts) return '';\n try {\n const d = new Date(ts);\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n } catch { return ts; }\n}\n\nfunction renderMarkdown(text) {\n return esc(text)\n .replace(/^## (.+)$/gm, '<h2>$1</h2>')\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/^- (.+)$/gm, '<li>$1</li>')\n .replace(/(<li>.*<\\/li>)/s, '<ul>$1</ul>')\n .replace(/\\n/g, '<br>');\n}\n\n// Init\nloadActivity();\n</script>\n</body>\n</html>","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the Docker Compose file:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"14 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"services:\n screenpipe-app:\n build: .\n container_name: screenpipe-app\n restart: unless-stopped\n ports:\n - \"8765:8000\"\n volumes:\n - /volume1/screenpipe/db.sqlite:/data/db.sqlite:ro\n env_file:\n - .env\n environment:\n TZ: Europe/Sofia","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":".env","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"2 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ANTHROPIC_API_KEY=your_key_here","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Now let's build and test:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Build Docker image","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cd /volume1/screenpipe/app && docker compose build 2>&1","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\npermission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head \"http://%2Fvar%2Frun%2Fdocker.sock/_ping\": dial unix /var/run/docker.sock: connect: permission denied\n[rerun: b10]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Build Docker image with sudo","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sudo docker compose -f /volume1/screenpipe/app/docker-compose.yml build 2>&1","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\nsudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper\nsudo: a password is required\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check current user and groups","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"groups && id","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"admin users ughomeusers Media Social\nuid=1000(Adm1n) gid=10(admin) groups=10(admin),100(users),133(ughomeusers),1001(Media),1002(Social)\n[rerun: b12]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"The user isn't in the docker group. Let me verify the files look correct and check the overall structure:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List all created app files","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"find /volume1/screenpipe/app -type f | sort","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"/volume1/screenpipe/app/cli.py\n/volume1/screenpipe/app/consumers/activity.py\n/volume1/screenpipe/app/consumers/audio.py\n/volume1/screenpipe/app/consumers/__init__.py\n/volume1/screenpipe/app/consumers/ocr.py\n/volume1/screenpipe/app/consumers/summary.py\n/volume1/screenpipe/app/db.py\n/volume1/screenpipe/app/docker-compose.yml\n/volume1/screenpipe/app/Dockerfile\n/volume1/screenpipe/app/.env\n/volume1/screenpipe/app/main.py\n/volume1/screenpipe/app/requirements.txt\n/volume1/screenpipe/app/static/index.html\n[rerun: b13]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Everything is built. You'll need to run Docker as root (or add yourself to the docker group). Here's how to get it running:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"To build and start:","depth":23,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"# From DSM or an admin shell with docker access:\ncd /volume1/screenpipe/app\ndocker compose up -d --build","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Web UI:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"http://your-nas-ip:8765","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"CLI (inside container):","depth":23,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker exec screenpipe-app python cli.py summary\ndocker exec screenpipe-app python cli.py summary --type standup\ndocker exec screenpipe-app python cli.py activity\ndocker exec screenpipe-app python cli.py search \"docker\"\ndocker exec screenpipe-app python cli.py audio","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"What's been built:","depth":23,"role_description":"text"}]...
|
6437832270600868115
|
-8187121230352777210
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 16, Col 1
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null
Copy code to clipboard
OUT
Exit code 1
[rerun: b4]
Bash
Bootstrap pip then install packages
IN
python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10
Copy code to clipboard
OUT
Exit code 1
/usr/bin/python3: No module named ensurepip
[rerun: b5]
Bash
Install pip via apt
IN
apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
OUT
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
[rerun: b6]
Bash
Install pip with sudo
Reason:
lets make it in docker, not to install it in nas directly
IN
sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
Good call. Let me check what Docker setup you already have and build a proper containerized app.
Bash
Check existing docker-compose for reference
IN
ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30
Copy code to clipboard
OUT
consume
data
db
docker-compose.yml
export
mcp-server
media
redis
trash
services:
redis:
image: redis:8
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
security_opt:
- no-new-privileges:true
read_only: true
user: 1000:10
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- /volume2/docker/paperlessngx/redis:/data:rw
environment:
TZ: Europe/Sofia
restart: always
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
[rerun: b7]
Bash
Check Docker availability
IN
docker --version && docker compose version 2>/dev/null
Copy code to clipboard
OUT
Docker version 26.1.0, build 9714adc
Docker Compose version v2.26.1
[rerun: b8]
Bash
Create app directory structure
IN
mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static
Copy code to clipboard
OUT
[rerun: b9]
Now let me build everything. I'll create all the files:
Write
requirements.txt
requirements.txt
6 lines
fastapi==0.115.12
uvicorn[standard]==0.34.0
click==8.1.8
anthropic==0.49.0
python-dotenv==1.1.0
Write
Dockerfile
Dockerfile
13 lines
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "[IP_ADDRESS]", "--port", "8000"]
Write
db.py
db.py
28 lines
import sqlite3
from contextlib import contextmanager
from datetime import date, datetime, timedelta, timezone
from typing import Generator
DB_PATH = "/data/db.sqlite"
@contextmanager
def get_conn() -> Generator[sqlite3.Connection, None, None]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
yield conn
finally:
conn.close()
def date_range(for_date: date) -> tuple[str, str]:
"""Return ISO timestamps for start/end of a given date (UTC)."""
start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)
end = start + timedelta(days=1)
return start.isoformat(), end.isoformat()
def today() -> date:
return datetime.now(timezone.utc).date()
Write
__init__.py
__init__.py
1 line
Write
activity.py
activity.py
123 lines
"""App usage and window focus time consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def app_time(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per app for a given date, sorted descending."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
o.app_name,
COUNT(*) as frame_count,
-- each frame ~ 2s at 0.5fps; convert to minutes
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY o.app_name
ORDER BY frame_count DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per window/tab, optionally filtered by app."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
o.app_name,
o.window_name,
COUNT(*) as frame_count,
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
"""
params: list = [start, end]
if app:
query += " AND o.app_name = ?"
params.append(app)
query += " GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:
"""Return activity bucketed into N-minute intervals."""
d = for_date or _today()
start, end = date_range(d)
interval_sec = interval_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
COUNT(*) as frames
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY bucket, o.app_name
ORDER BY bucket, frames DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def summary_stats(for_date: date | None = None) -> dict[str, Any]:
"""Return high-level stats for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
frames_row = conn.execute(
"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last "
"FROM frames WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
app_count = conn.execute(
"""
SELECT COUNT(DISTINCT o.app_name) as n
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''
""",
(start, end),
).fetchone()
audio_count = conn.execute(
"SELECT COUNT(*) as n FROM audio_transcriptions "
"WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
return {
"date": str(d),
"total_frames": frames_row["n"],
"first_seen": frames_row["first"],
"last_seen": frames_row["last"],
"unique_apps": app_count["n"],
"audio_segments": audio_count["n"],
}
Write
ocr.py
ocr.py
92 lines
"""OCR text search and aggregation consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:
"""Full-text search OCR content."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
f.timestamp,
o.app_name,
o.window_name,
snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet
FROM ocr_text_fts
JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid
JOIN frames f ON o.frame_id = f.id
WHERE ocr_text_fts MATCH ?
AND f.timestamp >= ? AND f.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:
"""Return all OCR text for a date, optionally only focused windows."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
f.timestamp,
o.app_name,
o.window_name,
o.text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
"""
params: list = [start, end]
if focused_only:
query += " AND o.focused = TRUE"
query += " ORDER BY f.timestamp"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:
"""
Return OCR text deduplicated by time chunk + app to reduce LLM token usage.
Groups frames into N-minute buckets and returns one representative text per app per bucket.
"""
d = for_date or _today()
start, end = date_range(d)
interval_sec = chunk_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
o.window_name,
substr(o.text, 1, 500) as text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
GROUP BY bucket, o.app_name
ORDER BY bucket
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
Write
audio.py
audio.py
61 lines
"""Audio transcription consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return all audio transcriptions for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT timestamp, transcription, device, is_input_device, speaker_id
FROM audio_transcriptions
WHERE timestamp >= ? AND timestamp < ?
AND length(transcription) > 2
ORDER BY timestamp
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:
"""Search audio transcriptions."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
a.timestamp,
a.device,
snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet
FROM audio_transcriptions_fts
JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id
WHERE audio_transcriptions_fts MATCH ?
AND a.timestamp >= ? AND a.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def formatted_transcript(for_date: date | None = None) -> str:
"""Return audio as a readable transcript string."""
rows = transcriptions(for_date)
if not rows:
return "(no audio transcriptions)"
lines = []
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
lines.append(f"[{r['timestamp']}] [{label}] {r['transcription']}")
return "\n".join(lines)
Write
summary.py
summary.py
162 lines
"""AI summary generator using Claude."""
import os
from datetime import date
from typing import Any
from consumers.activity import app_time, summary_stats
from consumers.ocr import deduplicated_text
from consumers.audio import formatted_transcript
SUMMARY_TYPES = {
"day_recap": {
"title": "Day Recap",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a concise day recap using EXACTLY this format:
## Summary
One sentence: what I mainly worked on today.
## Accomplishments
- Top 3 things I finished, with approximate times
- Name specific apps, files, or projects
## Key Moments
- Important things seen or heard, with timestamps
## Unfinished Work
- What to continue tomorrow
## Patterns
- Apps used most, topics that came up repeatedly
Only report what you can verify from the data. End with:
**Next step:** [most important thing to continue]""",
},
"standup": {
"title": "Standup Update",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a brief standup update:
**Yesterday:** What I worked on (2-3 bullets)
**Today:** What I plan to continue (1-2 bullets)
**Blockers:** Any issues observed (or "None")
Keep it under 150 words. Only report what's verifiable from the data.""",
},
"focus_time": {
"title": "Focus & Distraction Analysis",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
Analyze focus vs distraction patterns:
## Deep Work Periods
- When and how long were sustained focus sessions?
- What was being worked on?
## Distractions
- Which apps/sites were used recreationally?
- How much time was lost to context switching?
## Recommendations
- 2-3 concrete suggestions to improve focus tomorrow
Be specific with times and app names.""",
},
}
def _build_context(for_date: date) -> dict[str, str]:
apps = app_time(for_date)
app_lines = "\n".join(f"- {a['app_name']}: {a['minutes']} min" for a in apps[:20])
ocr_rows = deduplicated_text(for_date, chunk_minutes=5)
ocr_lines = "\n".join(
f"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}"
for r in ocr_rows[:100]
)
audio = formatted_transcript(for_date)
return {
"app_time": app_lines or "(no app data)",
"ocr_text": ocr_lines or "(no screen data)",
"audio": audio[:3000] if len(audio) > 3000 else audio,
}
def generate(
summary_type: str = "day_recap",
for_date: date | None = None,
api_key: str | None = None,
) -> dict[str, Any]:
"""Generate an AI summary. Returns dict with 'title', 'content', 'date'."""
import anthropic
d = for_date or date.today()
key = api_key or os.environ.get("ANTHROPIC_API_KEY", "")
if not key:
return {
"title": "Error",
"content": "ANTHROPIC_API_KEY not set. Add it to your .env file.",
"date": str(d),
}
spec = SUMMARY_TYPES.get(summary_type)
if not spec:
return {"title": "Error", "content": f"Unknown summary type: {summary_type}", "date": str(d)}
stats = summary_stats(d)
if stats["total_frames"] == 0:
return {
"title": spec["title"],
"content": f"No screen data found for {d}.",
"date": str(d),
}
ctx = _build_context(d)
prompt = spec["prompt"].format(**ctx)
client = anthropic.Anthropic(api_key=key)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return {
"title": spec["title"],
"content": message.content[0].text,
"date": str(d),
"stats": stats,
}
Now the FastAPI backend and CLI:
Write
main.py
main.py
89 lines
"""Screenpipe dashboard — FastAPI web UI."""
import os
from datetime import date, datetime
from typing import Any
from dotenv import load_dotenv
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
load_dotenv()
from consumers.activity import app_time, window_time, timeline, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions, search as audio_search
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
app = FastAPI(title="Screenpipe Dashboard")
app.mount("/static", StaticFiles(directory="static"), name="static")
def _parse_date(d: str | None) -> date | None:
if not d:
return None
try:
return date.fromisoformat(d)
except ValueError:
return None
@app.get("/", response_class=HTMLResponse)
async def index():
with open("static/index.html") as f:
return f.read()
# ── Activity ──────────────────────────────────────────────────────────────────
@app.get("/api/stats")
async def stats(d: str | None = Query(None)):
return summary_stats(_parse_date(d))
@app.get("/api/activity/apps")
async def activity_apps(d: str | None = Query(None)):
return app_time(_parse_date(d))
@app.get("/api/activity/windows")
async def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):
return window_time(_parse_date(d), app_name)
@app.get("/api/activity/timeline")
async def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):
return timeline(_parse_date(d), interval)
# ── Search ───────────────────────────────────────────────────────────────────
@app.get("/api/search/ocr")
async def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):
return ocr_search(q, _parse_date(d), limit)
@app.get("/api/search/audio")
async def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):
return audio_search(q, _parse_date(d), limit)
# ── Audio ─────────────────────────────────────────────────────────────────────
@app.get("/api/audio")
async def audio(d: str | None = Query(None)):
return transcriptions(_parse_date(d))
# ── Summaries ─────────────────────────────────────────────────────────────────
@app.get("/api/summary/types")
async def summary_types():
return [{"id": k, "title": v["title"]} for k, v in SUMMARY_TYPES.items()]
@app.post("/api/summary/generate")
async def generate_summary(type: str = "day_recap", d: str | None = None):
result = gen_summary(type, _parse_date(d))
return result
Write
cli.py
cli.py
131 lines
#!/usr/bin/env python3
"""Screenpipe CLI — run summaries and reports on demand."""
import os
import sys
from datetime import date, timedelta
import click
from dotenv import load_dotenv
load_dotenv()
sys.path.insert(0, os.path.dirname(__file__))
from consumers.activity import app_time, window_time, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
def _resolve_date(d_str: str | None) -> date | None:
if not d_str:
return None
if d_str == "yesterday":
return date.today() - timedelta(days=1)
if d_str == "today":
return date.today()
return date.fromisoformat(d_str)
@click.group()
def cli():
"""Screenpipe data explorer and summariser."""
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--type", "-t", "summary_type", default="day_recap",
type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)
def summary(d, summary_type):
"""Generate an AI summary for a date (default: today)."""
target = _resolve_date(d)
click.echo(f"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...")
result = gen_summary(summary_type, target)
click.echo(f"\n{'─'*60}")
click.echo(f" {result['title']} — {result['date']}")
click.echo(f"{'─'*60}\n")
click.echo(result["content"])
if "stats" in result:
s = result["stats"]
click.echo(f"\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, "
f"{s['audio_segments']} audio segments]")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--app", "-a", default=None, help="Filter by app name")
@click.option("--windows", "-w", is_flag=True, help="Show window breakdown instead of apps")
def activity(d, app, windows):
"""Show time spent per app or window."""
target = _resolve_date(d)
label = str(target or date.today())
if windows or app:
rows = window_time(target, app)
click.echo(f"\nWindow time — {label}" + (f" [{app}]" if app else ""))
click.echo(f"{'App':<25} {'Window':<40} {'Min':>6}")
click.echo("─" * 75)
for r in rows:
click.echo(f"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}")
else:
rows = app_time(target)
stats = summary_stats(target)
click.echo(f"\nApp time — {label}")
click.echo(f"{'App':<30} {'Minutes':>8}")
click.echo("─" * 40)
for r in rows:
click.echo(f"{r['app_name']:<30} {r['minutes']:>8}")
click.echo(f"\nTotal frames: {stats['total_frames']} | "
f"Active: {stats['first_seen']} → {stats['last_seen']}")
@cli.command()
@click.argument("query")
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--audio", is_flag=True, help="Search audio instead of screen text")
@click.option("--limit", "-n", default=20, show_default=True)
def search(query, d, audio, limit):
"""Search OCR screen text or audio transcriptions."""
from consumers.audio import search as audio_search_fn
target = _resolve_date(d)
if audio:
rows = audio_search_fn(query, target, limit)
click.echo(f"\nAudio results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['snippet']}")
else:
rows = ocr_search(query, target, limit)
click.echo(f"\nOCR results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}")
click.echo(f" {r['snippet']}")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
def audio(d):
"""Show audio transcriptions for a date."""
target = _resolve_date(d)
rows = transcriptions(target)
if not rows:
click.echo("No audio transcriptions found.")
return
click.echo(f"\nAudio transcriptions — {target or date.today()}")
click.echo("─" * 60)
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
click.echo(f"[{r['timestamp']}] [{label}] {r['transcription']}")
@cli.command()
def serve():
"""Start the web UI (runs uvicorn on port 8000)."""
import uvicorn
click.echo("Starting Screenpipe dashboard at [URL_WITH_CREDENTIALS] (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
padding: 16px;
}
.card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }
.bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }
.bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }
.bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }
.bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }
td { padding: 6px 8px; border-bottom: 1px solid var(--border); }
tr:last-child td { border-bottom: none; }
tr:hover td { background: rgba(255,255,255,0.02); }
.timeline-wrap { overflow-x: auto; }
.timeline-grid { display: grid; gap: 2px; min-width: 600px; }
.tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }
.tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }
.tl-cell {
flex: 1;
height: 20px;
border-radius: 3px;
background: var(--border);
position: relative;
cursor: default;
font-size: 10px;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
color: white;
}
.summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
select {
background: var(--bg);
border: 1px solid var(--border);
color: var(--text);
padding: 6px 10px;
border-radius: 6px;
font-size: 13px;
}
button {
background: var(--accent);
color: white;
border: none;
padding: 8px 18px;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
font-weight: 500;
}
button:hover { opacity: 0.85; }
button:disabled { opacity: 0.4; cursor: default; }
.summary-output {
background: var(--bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 20px;
white-space: pre-wrap;
font-family: inherit;
line-height: 1.6;
min-height: 200px;
color: var(--text);
}
.summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }
.summary-output ul { padding-left: 20px; }
.summary-output strong { color: var(--accent2); }
.search-bar { display: flex; gap: 8px; margin-bottom: 16px; }
.search-bar input[type="text"] { flex: 1; }
.search-bar select { }
.result-item {
border-bottom: 1px solid var(--border);
padding: 10px 4px;
}
.result-item:last-child { border-bottom: none; }
.result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }
.result-snippet { font-size: 13px; }
.result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }
.audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }
.audio-item:last-child { border-bottom: none; }
.audio-badge {
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
flex-shrink: 0;
font-weight: 600;
}
...
|
NULL
|
|
1438
|
32
|
7
|
2026-04-11T17:27:55.966742+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928475966_m1.jpg...
|
Code
|
#!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73 #!/bin/bash • Untitled-1 — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 66, Col 1 (2524 selected)
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null
Copy code to clipboard
OUT
Exit code 1
[rerun: b4]
Bash
Bootstrap pip then install packages
IN
python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10
Copy code to clipboard
OUT
Exit code 1
/usr/bin/python3: No module named ensurepip
[rerun: b5]
Bash
Install pip via apt
IN
apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
OUT
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
[rerun: b6]
Bash
Install pip with sudo
Reason:
lets make it in docker, not to install it in nas directly
IN
sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
Good call. Let me check what Docker setup you already have and build a proper containerized app.
Bash
Check existing docker-compose for reference
IN
ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30
Copy code to clipboard
OUT
consume
data
db
docker-compose.yml
export
mcp-server
media
redis
trash
services:
redis:
image: redis:8
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
security_opt:
- no-new-privileges:true
read_only: true
user: 1000:10
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- /volume2/docker/paperlessngx/redis:/data:rw
environment:
TZ: Europe/Sofia
restart: always
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
[rerun: b7]
Bash
Check Docker availability
IN
docker --version && docker compose version 2>/dev/null
Copy code to clipboard
OUT
Docker version 26.1.0, build 9714adc
Docker Compose version v2.26.1
[rerun: b8]
Bash
Create app directory structure
IN
mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static
Copy code to clipboard
OUT
[rerun: b9]
Now let me build everything. I'll create all the files:
Write
requirements.txt
requirements.txt
6 lines
fastapi==0.115.12
uvicorn[standard]==0.34.0
click==8.1.8
anthropic==0.49.0
python-dotenv==1.1.0
Write
Dockerfile
Dockerfile
13 lines
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "[IP_ADDRESS]", "--port", "8000"]
Write
db.py
db.py
28 lines
import sqlite3
from contextlib import contextmanager
from datetime import date, datetime, timedelta, timezone
from typing import Generator
DB_PATH = "/data/db.sqlite"
@contextmanager
def get_conn() -> Generator[sqlite3.Connection, None, None]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
yield conn
finally:
conn.close()
def date_range(for_date: date) -> tuple[str, str]:
"""Return ISO timestamps for start/end of a given date (UTC)."""
start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)
end = start + timedelta(days=1)
return start.isoformat(), end.isoformat()
def today() -> date:
return datetime.now(timezone.utc).date()
Write
__init__.py
__init__.py
1 line
Write
activity.py
activity.py
123 lines
"""App usage and window focus time consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def app_time(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per app for a given date, sorted descending."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
o.app_name,
COUNT(*) as frame_count,
-- each frame ~ 2s at 0.5fps; convert to minutes
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY o.app_name
ORDER BY frame_count DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per window/tab, optionally filtered by app."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
o.app_name,
o.window_name,
COUNT(*) as frame_count,
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
"""
params: list = [start, end]
if app:
query += " AND o.app_name = ?"
params.append(app)
query += " GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:
"""Return activity bucketed into N-minute intervals."""
d = for_date or _today()
start, end = date_range(d)
interval_sec = interval_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
COUNT(*) as frames
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY bucket, o.app_name
ORDER BY bucket, frames DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def summary_stats(for_date: date | None = None) -> dict[str, Any]:
"""Return high-level stats for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
frames_row = conn.execute(
"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last "
"FROM frames WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
app_count = conn.execute(
"""
SELECT COUNT(DISTINCT o.app_name) as n
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''
""",
(start, end),
).fetchone()
audio_count = conn.execute(
"SELECT COUNT(*) as n FROM audio_transcriptions "
"WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
return {
"date": str(d),
"total_frames": frames_row["n"],
"first_seen": frames_row["first"],
"last_seen": frames_row["last"],
"unique_apps": app_count["n"],
"audio_segments": audio_count["n"],
}
Write
ocr.py
ocr.py
92 lines
"""OCR text search and aggregation consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:
"""Full-text search OCR content."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
f.timestamp,
o.app_name,
o.window_name,
snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet
FROM ocr_text_fts
JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid
JOIN frames f ON o.frame_id = f.id
WHERE ocr_text_fts MATCH ?
AND f.timestamp >= ? AND f.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:
"""Return all OCR text for a date, optionally only focused windows."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
f.timestamp,
o.app_name,
o.window_name,
o.text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
"""
params: list = [start, end]
if focused_only:
query += " AND o.focused = TRUE"
query += " ORDER BY f.timestamp"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:
"""
Return OCR text deduplicated by time chunk + app to reduce LLM token usage.
Groups frames into N-minute buckets and returns one representative text per app per bucket.
"""
d = for_date or _today()
start, end = date_range(d)
interval_sec = chunk_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
o.window_name,
substr(o.text, 1, 500) as text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
GROUP BY bucket, o.app_name
ORDER BY bucket
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
Write
audio.py
audio.py
61 lines
"""Audio transcription consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return all audio transcriptions for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT timestamp, transcription, device, is_input_device, speaker_id
FROM audio_transcriptions
WHERE timestamp >= ? AND timestamp < ?
AND length(transcription) > 2
ORDER BY timestamp
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:
"""Search audio transcriptions."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
a.timestamp,
a.device,
snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet
FROM audio_transcriptions_fts
JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id
WHERE audio_transcriptions_fts MATCH ?
AND a.timestamp >= ? AND a.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def formatted_transcript(for_date: date | None = None) -> str:
"""Return audio as a readable transcript string."""
rows = transcriptions(for_date)
if not rows:
return "(no audio transcriptions)"
lines = []
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
lines.append(f"[{r['timestamp']}] [{label}] {r['transcription']}")
return "\n".join(lines)
Write
summary.py
summary.py
162 lines
"""AI summary generator using Claude."""
import os
from datetime import date
from typing import Any
from consumers.activity import app_time, summary_stats
from consumers.ocr import deduplicated_text
from consumers.audio import formatted_transcript
SUMMARY_TYPES = {
"day_recap": {
"title": "Day Recap",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a concise day recap using EXACTLY this format:
## Summary
One sentence: what I mainly worked on today.
## Accomplishments
- Top 3 things I finished, with approximate times
- Name specific apps, files, or projects
## Key Moments
- Important things seen or heard, with timestamps
## Unfinished Work
- What to continue tomorrow
## Patterns
- Apps used most, topics that came up repeatedly
Only report what you can verify from the data. End with:
**Next step:** [most important thing to continue]""",
},
"standup": {
"title": "Standup Update",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a brief standup update:
**Yesterday:** What I worked on (2-3 bullets)
**Today:** What I plan to continue (1-2 bullets)
**Blockers:** Any issues observed (or "None")
Keep it under 150 words. Only report what's verifiable from the data.""",
},
"focus_time": {
"title": "Focus & Distraction Analysis",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
Analyze focus vs distraction patterns:
## Deep Work Periods
- When and how long were sustained focus sessions?
- What was being worked on?
## Distractions
- Which apps/sites were used recreationally?
- How much time was lost to context switching?
## Recommendations
- 2-3 concrete suggestions to improve focus tomorrow
Be specific with times and app names.""",
},
}
def _build_context(for_date: date) -> dict[str, str]:
apps = app_time(for_date)
app_lines = "\n".join(f"- {a['app_name']}: {a['minutes']} min" for a in apps[:20])
ocr_rows = deduplicated_text(for_date, chunk_minutes=5)
ocr_lines = "\n".join(
f"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}"
for r in ocr_rows[:100]
)
audio = formatted_transcript(for_date)
return {
"app_time": app_lines or "(no app data)",
"ocr_text": ocr_lines or "(no screen data)",
"audio": audio[:3000] if len(audio) > 3000 else audio,
}
def generate(
summary_type: str = "day_recap",
for_date: date | None = None,
api_key: str | None = None,
) -> dict[str, Any]:
"""Generate an AI summary. Returns dict with 'title', 'content', 'date'."""
import anthropic
d = for_date or date.today()
key = api_key or os.environ.get("ANTHROPIC_API_KEY", "")
if not key:
return {
"title": "Error",
"content": "ANTHROPIC_API_KEY not set. Add it to your .env file.",
"date": str(d),
}
spec = SUMMARY_TYPES.get(summary_type)
if not spec:
return {"title": "Error", "content": f"Unknown summary type: {summary_type}", "date": str(d)}
stats = summary_stats(d)
if stats["total_frames"] == 0:
return {
"title": spec["title"],
"content": f"No screen data found for {d}.",
"date": str(d),
}
ctx = _build_context(d)
prompt = spec["prompt"].format(**ctx)
client = anthropic.Anthropic(api_key=key)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return {
"title": spec["title"],
"content": message.content[0].text,
"date": str(d),
"stats": stats,
}
Now the FastAPI backend and CLI:
Write
main.py
main.py
89 lines
"""Screenpipe dashboard — FastAPI web UI."""
import os
from datetime import date, datetime
from typing import Any
from dotenv import load_dotenv
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
load_dotenv()
from consumers.activity import app_time, window_time, timeline, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions, search as audio_search
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
app = FastAPI(title="Screenpipe Dashboard")
app.mount("/static", StaticFiles(directory="static"), name="static")
def _parse_date(d: str | None) -> date | None:
if not d:
return None
try:
return date.fromisoformat(d)
except ValueError:
return None
@app.get("/", response_class=HTMLResponse)
async def index():
with open("static/index.html") as f:
return f.read()
# ── Activity ──────────────────────────────────────────────────────────────────
@app.get("/api/stats")
async def stats(d: str | None = Query(None)):
return summary_stats(_parse_date(d))
@app.get("/api/activity/apps")
async def activity_apps(d: str | None = Query(None)):
return app_time(_parse_date(d))
@app.get("/api/activity/windows")
async def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):
return window_time(_parse_date(d), app_name)
@app.get("/api/activity/timeline")
async def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):
return timeline(_parse_date(d), interval)
# ── Search ───────────────────────────────────────────────────────────────────
@app.get("/api/search/ocr")
async def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):
return ocr_search(q, _parse_date(d), limit)
@app.get("/api/search/audio")
async def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):
return audio_search(q, _parse_date(d), limit)
# ── Audio ─────────────────────────────────────────────────────────────────────
@app.get("/api/audio")
async def audio(d: str | None = Query(None)):
return transcriptions(_parse_date(d))
# ── Summaries ─────────────────────────────────────────────────────────────────
@app.get("/api/summary/types")
async def summary_types():
return [{"id": k, "title": v["title"]} for k, v in SUMMARY_TYPES.items()]
@app.post("/api/summary/generate")
async def generate_summary(type: str = "day_recap", d: str | None = None):
result = gen_summary(type, _parse_date(d))
return result
Write
cli.py
cli.py
131 lines
#!/usr/bin/env python3
"""Screenpipe CLI — run summaries and reports on demand."""
import os
import sys
from datetime import date, timedelta
import click
from dotenv import load_dotenv
load_dotenv()
sys.path.insert(0, os.path.dirname(__file__))
from consumers.activity import app_time, window_time, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
def _resolve_date(d_str: str | None) -> date | None:
if not d_str:
return None
if d_str == "yesterday":
return date.today() - timedelta(days=1)
if d_str == "today":
return date.today()
return date.fromisoformat(d_str)
@click.group()
def cli():
"""Screenpipe data explorer and summariser."""
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--type", "-t", "summary_type", default="day_recap",
type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)
def summary(d, summary_type):
"""Generate an AI summary for a date (default: today)."""
target = _resolve_date(d)
click.echo(f"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...")
result = gen_summary(summary_type, target)
click.echo(f"\n{'─'*60}")
click.echo(f" {result['title']} — {result['date']}")
click.echo(f"{'─'*60}\n")
click.echo(result["content"])
if "stats" in result:
s = result["stats"]
click.echo(f"\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, "
f"{s['audio_segments']} audio segments]")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--app", "-a", default=None, help="Filter by app name")
@click.option("--windows", "-w", is_flag=True, help="Show window breakdown instead of apps")
def activity(d, app, windows):
"""Show time spent per app or window."""
target = _resolve_date(d)
label = str(target or date.today())
if windows or app:
rows = window_time(target, app)
click.echo(f"\nWindow time — {label}" + (f" [{app}]" if app else ""))
click.echo(f"{'App':<25} {'Window':<40} {'Min':>6}")
click.echo("─" * 75)
for r in rows:
click.echo(f"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}")
else:
rows = app_time(target)
stats = summary_stats(target)
click.echo(f"\nApp time — {label}")
click.echo(f"{'App':<30} {'Minutes':>8}")
click.echo("─" * 40)
for r in rows:
click.echo(f"{r['app_name']:<30} {r['minutes']:>8}")
click.echo(f"\nTotal frames: {stats['total_frames']} | "
f"Active: {stats['first_seen']} → {stats['last_seen']}")
@cli.command()
@click.argument("query")
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--audio", is_flag=True, help="Search audio instead of screen text")
@click.option("--limit", "-n", default=20, show_default=True)
def search(query, d, audio, limit):
"""Search OCR screen text or audio transcriptions."""
from consumers.audio import search as audio_search_fn
target = _resolve_date(d)
if audio:
rows = audio_search_fn(query, target, limit)
click.echo(f"\nAudio results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['snippet']}")
else:
rows = ocr_search(query, target, limit)
click.echo(f"\nOCR results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}")
click.echo(f" {r['snippet']}")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
def audio(d):
"""Show audio transcriptions for a date."""
target = _resolve_date(d)
rows = transcriptions(target)
if not rows:
click.echo("No audio transcriptions found.")
return
click.echo(f"\nAudio transcriptions — {target or date.today()}")
click.echo("─" * 60)
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
click.echo(f"[{r['timestamp']}] [{label}] {r['transcription']}")
@cli.command()
def serve():
"""Start the web UI (runs uvicorn on port 8000)."""
import uvicorn
click.echo("Starting Screenpipe dashboard at [URL_WITH_CREDENTIALS] (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
padding: 16px;
}
.card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }
.bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }
.bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }
.bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }
.bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }
td { padding: 6px 8px; border-bottom: 1px solid var(--border); }
tr:last-child td { border-bottom: none; }
tr:hover td { background: rgba(255,255,255,0.02); }
.timeline-wrap { overflow-x: auto; }
.timeline-grid { display: grid; gap: 2px; min-width: 600px; }
.tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }
.tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }
.tl-cell {
flex: 1;
height: 20px;
border-radius: 3px;
background: var(--border);
position: relative;
cursor: default;
font-size: 10px;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
color: white;
}
.summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
select {
background: var(--bg);
border: 1px solid var(--border);
color: var(--text);
padding: 6px 10px;
border-radius: 6px;
font-size: 13px;
}
button {
background: var(--accent);
color: white;
border: none;
padding: 8px 18px;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
font-weight: 500;
}
button:hover { opacity: 0.85; }
button:disabled { opacity: 0.4; cursor: default; }
.summary-output {
background: var(--bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 20px;
white-space: pre-wrap;
font-family: inherit;
line-height: 1.6;
min-height: 200px;
color: var(--text);
}
.summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }
.summary-output ul { padding-left: 20px; }
.summary-output strong { color: var(--accent2); }
.search-bar { display: flex; gap: 8px; margin-bottom: 16px; }
.search-bar input[type="text"] { flex: 1; }
.search-bar select { }
.result-item {
border-bottom: 1px solid var(--border);
padding: 10px 4px;
}
.result-item:last-child { border-bottom: none; }
.result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }
.result-snippet { font-size: 13px; }
.result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }
.audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }
.audio-item:last-child { border-bottom: none; }
.audio-badge {
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
flex-shrink: 0;
font-wei...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Build screenpipe data UI…, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","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 66, Col 1 (2524 selected)","depth":16,"bounds":{"left":0.98680556,"top":0.0,"width":0.013194442,"height":0.024444444},"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.8736111,"top":0.0,"width":0.11180556,"height":0.024444444},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Build screenpipe data UI and summary app","depth":18,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"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":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Let me explore the screenpipe directory to understand what we're working with.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List screenpipe directory contents","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"data\ndb.sqlite\npipes\n#recycle\n[rerun: b1]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List data and pipes directories","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09\n2026-04-11\nai-habits\nday-recap\nmeeting-summary\nstandup-update\ntime-breakdown\nvideo-export\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List tables in screenpipe SQLite database","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \".tables\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx\n[rerun: b3]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get ocr_text table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(ocr_text);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|frame_id|INTEGER|1||0\n1|text|TEXT|1||0\n2|text_json|TEXT|0||0\n3|app_name|TEXT|1|''|0\n4|ocr_engine|TEXT|1|'unknown'|0\n5|window_name|TEXT|0||0\n6|focused|BOOLEAN|0|FALSE|0\n7|text_length|INTEGER|0||0\n8|sync_id|TEXT|0||0\n9|synced_at|DATETIME|0||0\n[rerun: b4]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get audio_transcriptions table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(audio_transcriptions);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|audio_chunk_id|INTEGER|1||0\n2|offset_index|INTEGER|1||0\n3|timestamp|TIMESTAMP|1||0\n4|transcription|TEXT|1||0\n5|device|TEXT|1|''|0\n6|is_input_device|BOOLEAN|1|TRUE|0\n7|speaker_id|INTEGER|0||0\n8|transcription_engine|TEXT|1|'Whisper'|0\n9|start_time|REAL|0||0\n10|end_time|REAL|0||0\n11|text_length|INTEGER|0||0\n12|sync_id|TEXT|0||0\n13|synced_at|DATETIME|0||0\n[rerun: b5]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get frames, ui_events, video_chunks schemas","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|video_chunk_id|INTEGER|0|NULL|0\n2|offset_index|INTEGER|1|0|0\n3|timestamp|TIMESTAMP|1||0\n4|name|TEXT|0||0\n5|app_name|TEXT|0|NULL|0\n6|window_name|TEXT|0|NULL|0\n7|focused|BOOLEAN|0|NULL|0\n8|browser_url|TEXT|0|NULL|0\n9|device_name|TEXT|1|''|0\n10|sync_id|TEXT|0||0\n11|machine_id|TEXT|0||0\n12|synced_at|DATETIME|0||0\n13|snapshot_path|TEXT|0|NULL|0\n14|accessibility_text|TEXT|0|NULL|0\n15|accessibility_tree_json|TEXT|0|NULL|0\n16|content_hash|INTEGER|0|NULL|0\n17|simhash|INTEGER|0|NULL|0\n18|capture_trigger|TEXT|0|NULL|0\n19|text_source|TEXT|0|NULL|0\n20|cloud_blob_id|TEXT|0|NULL|0\n21|full_text|TEXT|0|NULL|0\n22|elements_ref_frame_id|INTEGER|0|NULL|0\n0|id|INTEGER|0||1\n1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0\n2|session_id|TEXT|0||0\n3|relative_ms|INTEGER|1|0|0\n4|event_type|TEXT|1||0\n5|x|INTEGER|0||0\n6|y|INTEGER|0||0\n7|delta_x|INTEGER|0||0\n8|delta_y|INTEGER|0||0\n9|button|INTEGER|0||0\n10|click_count|INTEGER|0||0\n11|key_code|INTEGER|0||0\n12|modifiers|INTEGER|0||0\n13|text_content|TEXT|0||0\n14|text_length|INTEGER|0||0\n15|app_name|TEXT|0||0\n16|app_pid|INTEGER|0||0\n17|window_title|TEXT|0||0\n18|browser_url|TEXT|0||0\n19|element_role|TEXT|0||0\n20|element_name|TEXT|0||0\n21|element_value|TEXT|0||0\n22|element_description|TEXT|0||0\n23|element_automation_id|TEXT|0||0\n24|element_bounds|TEXT|0||0\n25|frame_id|INTEGER|0||0\n26|sync_id|TEXT|0||0\n27|machine_id|TEXT|0||0\n28|synced_at|DATETIME|0||0\n0|id|INTEGER|0||1\n1|file_path|TEXT|1||0\n2|device_name|TEXT|1|''|0\n3|sync_id|TEXT|0||0\n4|machine_id|TEXT|0||0\n5|synced_at|DATETIME|0||0\n6|fps|REAL|1|0.5|0\n7|cloud_blob_id|TEXT|0|NULL|0\n[rerun: b6]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check data counts and date ranges","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*) FROM ocr_text;\" 2>/dev/null","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00\n3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00\n666\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Explore existing pipes for patterns","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Read day-recap pipe documentation","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cat /volume1/screenpipe/pipes/day-recap/pipe.md","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"---\nschedule: manual\nenabled: true\ntemplate: true\ntitle: Day Recap\ndescription: \"Today's accomplishments, key moments, and unfinished work\"\nicon: \"📋\"\nfeatured: true\n---\n\nAnalyze my screen and audio recordings from today (last 16 hours only). \n\nRead screenpipe skill first.\n\nUse this exact format:\n\n## Summary\nOne sentence: what I mainly did today.\n\n## Accomplishments\n- Top 3 things I finished, with timestamps (e.g. \"2:30 PM\")\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things I saw, said, or heard — with timestamps\n\n## Unfinished Work\n- What I should continue tomorrow — name the app/file/task\n\n## Patterns\n- Apps I used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with: \"**Next step:** [most important thing to continue]\"\n[rerun: b9]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample app names from frames","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Safari\nActivity Monitor\nDia\niTerm2\nControl Centre\nUserNotificationCenter\nFinder\nClaude\nSlack\nFirefox\nRaycast\nNetAuthAgent\nQuickTime Player\n[rerun: b10]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample joined frame+ocr data for today","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE\n2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER\n2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p\n2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p\n2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample recent audio transcriptions","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09T17:02:52+00:00|.|System Audio\n2026-04-09T16:59:22+00:00|Class is technically...|System Audio\n2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio\n[rerun: b12]","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Good data to work with. Here's what we have:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ocr_text","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Screen captures with OCR text, app name, window name (1135 frames so far)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"audio_transcriptions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Voice/system audio transcripts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ui_events","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Mouse/keyboard events with app context","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Raw video files","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Before I start building, a few quick questions:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Tech stack","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"AI summaries","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"What summaries matter most?","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Day recap (what apps/windows you used, key text seen)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"App time breakdown (time per app)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Audio/conversation recap","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Custom searchable timeline","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Here's the architecture I'm thinking:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"/volume1/screenpipe/app/\n├── main.py # FastAPI web UI\n├── cli.py # Click CLI: `python cli.py day-recap`\n├── db.py # Read-only queries against db.sqlite\n├── consumers/\n│ ├── activity.py # App usage, time per window\n│ ├── ocr.py # OCR text aggregation + search\n│ ├── audio.py # Transcription queries\n│ └── summary.py # AI summary builder\n└── static/\n └── index.html # Single-page UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"CLI commands would look like:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"python cli.py day-recap # EOD summary\npython cli.py activity --date today # App time breakdown\npython cli.py search \"docker\" # Search OCR/audio text\npython cli.py serve # Launch web UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Does this direction work? Any preferences on the stack or which summaries to prioritize?","depth":22,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"seesm ok","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Python and available packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 --version && pip3 list 2>/dev/null | grep -E \"fastapi|uvicorn|click|anthropic|httpx|jinja\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Python 3.11.2\n[rerun: b1]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Verify join works for today's data","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"\nSELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len\nFROM frames f JOIN ocr_text o ON f.id = o.frame_id\nWHERE DATE(f.timestamp) = '2026-04-11'\nORDER BY f.timestamp DESC LIMIT 3;\n\"","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T12:54:42.597794+00:00|||2111\n2026-04-11T12:54:41.915916+00:00|||2110\n2026-04-11T12:54:39.912712+00:00|||2111\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install required packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"/bin/bash: line 1: pip3: command not found\n[rerun: b3]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Find pip","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"which pip || which pip3 || python3 -m pip --version 2>/dev/null","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\n[rerun: b4]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bootstrap pip then install packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\n/usr/bin/python3: No module named ensurepip\n[rerun: b5]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install pip via apt","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"apt-get install -y python3-pip python3-venv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)\nE: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?\n[rerun: b6]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install pip with sudo","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Reason:","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"lets make it in docker, not to install it in nas directly","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Good call. Let me check what Docker setup you already have and build a proper containerized app.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check existing docker-compose for reference","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"consume\ndata\ndb\ndocker-compose.yml\nexport\nmcp-server\nmedia\nredis\ntrash\nservices:\n redis:\n image: redis:8\n command:\n - /bin/sh\n - -c\n - redis-server --requirepass redispass\n container_name: PaperlessNGX-REDIS\n hostname: paper-redis\n security_opt:\n - no-new-privileges:true\n read_only: true\n user: 1000:10\n healthcheck:\n test: [\"CMD-SHELL\", \"redis-cli ping || exit 1\"]\n volumes:\n - /volume2/docker/paperlessngx/redis:/data:rw\n environment:\n TZ: Europe/Sofia\n restart: always\n\n db:\n image: postgres:17\n container_name: PaperlessNGX-DB\n hostname: paper-db\n mem_limit: 1g\n security_opt:\n - no-new-privileges:true\n healthcheck:\n test: [\"CMD\", \"pg_isready\", \"-q\", \"-d\", \"paperless\", \"-U\", \"paperlessuser\"]\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Docker availability","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"docker --version && docker compose version 2>/dev/null","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Docker version 26.1.0, build 9714adc\nDocker Compose version v2.26.1\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Create app directory structure","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"[rerun: b9]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Now let me build everything. I'll create all the files:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"requirements.txt","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"requirements.txt","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"6 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"fastapi==0.115.12\nuvicorn[standard]==0.34.0\nclick==8.1.8\nanthropic==0.49.0\npython-dotenv==1.1.0","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"13 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"FROM python:3.12-slim\n\nWORKDIR /app\n\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY . .\n\nEXPOSE 8000\n\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"db.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"db.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"28 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"import sqlite3\nfrom contextlib import contextmanager\nfrom datetime import date, datetime, timedelta, timezone\nfrom typing import Generator\n\nDB_PATH = \"/data/db.sqlite\"\n\n\n@contextmanager\ndef get_conn() -> Generator[sqlite3.Connection, None, None]:\n conn = sqlite3.connect(f\"file:{DB_PATH}?mode=ro\", uri=True)\n conn.row_factory = sqlite3.Row\n try:\n yield conn\n finally:\n conn.close()\n\n\ndef date_range(for_date: date) -> tuple[str, str]:\n \"\"\"Return ISO timestamps for start/end of a given date (UTC).\"\"\"\n start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)\n end = start + timedelta(days=1)\n return start.isoformat(), end.isoformat()\n\n\ndef today() -> date:\n return datetime.now(timezone.utc).date()","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"__init__.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"__init__.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"1 line","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"activity.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"activity.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"123 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"App usage and window focus time consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef app_time(for_date: date | None = None) -> list[dict[str, Any]]:\n \"\"\"Return minutes spent per app for a given date, sorted descending.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n o.app_name,\n COUNT(*) as frame_count,\n -- each frame ~ 2s at 0.5fps; convert to minutes\n ROUND(COUNT(*) * 2.0 / 60, 1) as minutes\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n GROUP BY o.app_name\n ORDER BY frame_count DESC\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:\n \"\"\"Return minutes spent per window/tab, optionally filtered by app.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n query = \"\"\"\n SELECT\n o.app_name,\n o.window_name,\n COUNT(*) as frame_count,\n ROUND(COUNT(*) * 2.0 / 60, 1) as minutes\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n \"\"\"\n params: list = [start, end]\n if app:\n query += \" AND o.app_name = ?\"\n params.append(app)\n query += \" GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50\"\n\n with get_conn() as conn:\n rows = conn.execute(query, params).fetchall()\n return [dict(r) for r in rows]\n\n\ndef timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:\n \"\"\"Return activity bucketed into N-minute intervals.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n interval_sec = interval_minutes * 60\n\n with get_conn() as conn:\n rows = conn.execute(\n f\"\"\"\n SELECT\n datetime(\n (strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},\n 'unixepoch'\n ) as bucket,\n o.app_name,\n COUNT(*) as frames\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n GROUP BY bucket, o.app_name\n ORDER BY bucket, frames DESC\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef summary_stats(for_date: date | None = None) -> dict[str, Any]:\n \"\"\"Return high-level stats for a date.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n frames_row = conn.execute(\n \"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last \"\n \"FROM frames WHERE timestamp >= ? AND timestamp < ?\",\n (start, end),\n ).fetchone()\n\n app_count = conn.execute(\n \"\"\"\n SELECT COUNT(DISTINCT o.app_name) as n\n FROM frames f JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''\n \"\"\",\n (start, end),\n ).fetchone()\n\n audio_count = conn.execute(\n \"SELECT COUNT(*) as n FROM audio_transcriptions \"\n \"WHERE timestamp >= ? AND timestamp < ?\",\n (start, end),\n ).fetchone()\n\n return {\n \"date\": str(d),\n \"total_frames\": frames_row[\"n\"],\n \"first_seen\": frames_row[\"first\"],\n \"last_seen\": frames_row[\"last\"],\n \"unique_apps\": app_count[\"n\"],\n \"audio_segments\": audio_count[\"n\"],\n }","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"ocr.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ocr.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"92 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"OCR text search and aggregation consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:\n \"\"\"Full-text search OCR content.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n f.timestamp,\n o.app_name,\n o.window_name,\n snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet\n FROM ocr_text_fts\n JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid\n JOIN frames f ON o.frame_id = f.id\n WHERE ocr_text_fts MATCH ?\n AND f.timestamp >= ? AND f.timestamp < ?\n ORDER BY rank\n LIMIT ?\n \"\"\",\n (query, start, end, limit),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:\n \"\"\"Return all OCR text for a date, optionally only focused windows.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n query = \"\"\"\n SELECT\n f.timestamp,\n o.app_name,\n o.window_name,\n o.text\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n AND length(o.text) > 20\n \"\"\"\n params: list = [start, end]\n if focused_only:\n query += \" AND o.focused = TRUE\"\n query += \" ORDER BY f.timestamp\"\n\n with get_conn() as conn:\n rows = conn.execute(query, params).fetchall()\n return [dict(r) for r in rows]\n\n\ndef deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:\n \"\"\"\n Return OCR text deduplicated by time chunk + app to reduce LLM token usage.\n Groups frames into N-minute buckets and returns one representative text per app per bucket.\n \"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n interval_sec = chunk_minutes * 60\n\n with get_conn() as conn:\n rows = conn.execute(\n f\"\"\"\n SELECT\n datetime(\n (strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},\n 'unixepoch'\n ) as bucket,\n o.app_name,\n o.window_name,\n substr(o.text, 1, 500) as text\n FROM frames f\n JOIN ocr_text o ON f.id = o.frame_id\n WHERE f.timestamp >= ? AND f.timestamp < ?\n AND o.app_name != ''\n AND length(o.text) > 20\n GROUP BY bucket, o.app_name\n ORDER BY bucket\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"audio.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"audio.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"61 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"Audio transcription consumer.\"\"\"\nfrom datetime import date\nfrom typing import Any\n\nfrom db import get_conn, date_range, today as _today\n\n\ndef transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:\n \"\"\"Return all audio transcriptions for a date.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT timestamp, transcription, device, is_input_device, speaker_id\n FROM audio_transcriptions\n WHERE timestamp >= ? AND timestamp < ?\n AND length(transcription) > 2\n ORDER BY timestamp\n \"\"\",\n (start, end),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:\n \"\"\"Search audio transcriptions.\"\"\"\n d = for_date or _today()\n start, end = date_range(d)\n\n with get_conn() as conn:\n rows = conn.execute(\n \"\"\"\n SELECT\n a.timestamp,\n a.device,\n snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet\n FROM audio_transcriptions_fts\n JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id\n WHERE audio_transcriptions_fts MATCH ?\n AND a.timestamp >= ? AND a.timestamp < ?\n ORDER BY rank\n LIMIT ?\n \"\"\",\n (query, start, end, limit),\n ).fetchall()\n return [dict(r) for r in rows]\n\n\ndef formatted_transcript(for_date: date | None = None) -> str:\n \"\"\"Return audio as a readable transcript string.\"\"\"\n rows = transcriptions(for_date)\n if not rows:\n return \"(no audio transcriptions)\"\n lines = []\n for r in rows:\n label = \"MIC\" if r[\"is_input_device\"] else \"SYS\"\n lines.append(f\"[{r['timestamp']}] [{label}] {r['transcription']}\")\n return \"\\n\".join(lines)","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"summary.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"summary.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"162 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"AI summary generator using Claude.\"\"\"\nimport os\nfrom datetime import date\nfrom typing import Any\n\nfrom consumers.activity import app_time, summary_stats\nfrom consumers.ocr import deduplicated_text\nfrom consumers.audio import formatted_transcript\n\n\nSUMMARY_TYPES = {\n \"day_recap\": {\n \"title\": \"Day Recap\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\n## Audio/speech:\n{audio}\n\nWrite a concise day recap using EXACTLY this format:\n\n## Summary\nOne sentence: what I mainly worked on today.\n\n## Accomplishments\n- Top 3 things I finished, with approximate times\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things seen or heard, with timestamps\n\n## Unfinished Work\n- What to continue tomorrow\n\n## Patterns\n- Apps used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with:\n**Next step:** [most important thing to continue]\"\"\",\n },\n \"standup\": {\n \"title\": \"Standup Update\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\n## Audio/speech:\n{audio}\n\nWrite a brief standup update:\n\n**Yesterday:** What I worked on (2-3 bullets)\n**Today:** What I plan to continue (1-2 bullets)\n**Blockers:** Any issues observed (or \"None\")\n\nKeep it under 150 words. Only report what's verifiable from the data.\"\"\",\n },\n \"focus_time\": {\n \"title\": \"Focus & Distraction Analysis\",\n \"prompt\": \"\"\"\\\nYou are analyzing a person's computer activity for the day.\n\n## App usage (minutes per app):\n{app_time}\n\n## Screen content (sampled every 5 minutes):\n{ocr_text}\n\nAnalyze focus vs distraction patterns:\n\n## Deep Work Periods\n- When and how long were sustained focus sessions?\n- What was being worked on?\n\n## Distractions\n- Which apps/sites were used recreationally?\n- How much time was lost to context switching?\n\n## Recommendations\n- 2-3 concrete suggestions to improve focus tomorrow\n\nBe specific with times and app names.\"\"\",\n },\n}\n\n\ndef _build_context(for_date: date) -> dict[str, str]:\n apps = app_time(for_date)\n app_lines = \"\\n\".join(f\"- {a['app_name']}: {a['minutes']} min\" for a in apps[:20])\n\n ocr_rows = deduplicated_text(for_date, chunk_minutes=5)\n ocr_lines = \"\\n\".join(\n f\"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}\"\n for r in ocr_rows[:100]\n )\n\n audio = formatted_transcript(for_date)\n\n return {\n \"app_time\": app_lines or \"(no app data)\",\n \"ocr_text\": ocr_lines or \"(no screen data)\",\n \"audio\": audio[:3000] if len(audio) > 3000 else audio,\n }\n\n\ndef generate(\n summary_type: str = \"day_recap\",\n for_date: date | None = None,\n api_key: str | None = None,\n) -> dict[str, Any]:\n \"\"\"Generate an AI summary. Returns dict with 'title', 'content', 'date'.\"\"\"\n import anthropic\n\n d = for_date or date.today()\n key = api_key or os.environ.get(\"ANTHROPIC_API_KEY\", \"\")\n if not key:\n return {\n \"title\": \"Error\",\n \"content\": \"ANTHROPIC_API_KEY not set. Add it to your .env file.\",\n \"date\": str(d),\n }\n\n spec = SUMMARY_TYPES.get(summary_type)\n if not spec:\n return {\"title\": \"Error\", \"content\": f\"Unknown summary type: {summary_type}\", \"date\": str(d)}\n\n stats = summary_stats(d)\n if stats[\"total_frames\"] == 0:\n return {\n \"title\": spec[\"title\"],\n \"content\": f\"No screen data found for {d}.\",\n \"date\": str(d),\n }\n\n ctx = _build_context(d)\n prompt = spec[\"prompt\"].format(**ctx)\n\n client = anthropic.Anthropic(api_key=key)\n message = client.messages.create(\n model=\"claude-opus-4-6\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": prompt}],\n )\n\n return {\n \"title\": spec[\"title\"],\n \"content\": message.content[0].text,\n \"date\": str(d),\n \"stats\": stats,\n }","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the FastAPI backend and CLI:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"main.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"89 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"\"\"\"Screenpipe dashboard — FastAPI web UI.\"\"\"\nimport os\nfrom datetime import date, datetime\nfrom typing import Any\n\nfrom dotenv import load_dotenv\nfrom fastapi import FastAPI, Query\nfrom fastapi.responses import HTMLResponse, JSONResponse\nfrom fastapi.staticfiles import StaticFiles\n\nload_dotenv()\n\nfrom consumers.activity import app_time, window_time, timeline, summary_stats\nfrom consumers.ocr import search as ocr_search\nfrom consumers.audio import transcriptions, search as audio_search\nfrom consumers.summary import generate as gen_summary, SUMMARY_TYPES\n\napp = FastAPI(title=\"Screenpipe Dashboard\")\napp.mount(\"/static\", StaticFiles(directory=\"static\"), name=\"static\")\n\n\ndef _parse_date(d: str | None) -> date | None:\n if not d:\n return None\n try:\n return date.fromisoformat(d)\n except ValueError:\n return None\n\n\n@app.get(\"/\", response_class=HTMLResponse)\nasync def index():\n with open(\"static/index.html\") as f:\n return f.read()\n\n\n# ── Activity ──────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/stats\")\nasync def stats(d: str | None = Query(None)):\n return summary_stats(_parse_date(d))\n\n\n@app.get(\"/api/activity/apps\")\nasync def activity_apps(d: str | None = Query(None)):\n return app_time(_parse_date(d))\n\n\n@app.get(\"/api/activity/windows\")\nasync def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):\n return window_time(_parse_date(d), app_name)\n\n\n@app.get(\"/api/activity/timeline\")\nasync def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):\n return timeline(_parse_date(d), interval)\n\n\n# ── Search ───────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/search/ocr\")\nasync def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):\n return ocr_search(q, _parse_date(d), limit)\n\n\n@app.get(\"/api/search/audio\")\nasync def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):\n return audio_search(q, _parse_date(d), limit)\n\n\n# ── Audio ─────────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/audio\")\nasync def audio(d: str | None = Query(None)):\n return transcriptions(_parse_date(d))\n\n\n# ── Summaries ─────────────────────────────────────────────────────────────────\n\n@app.get(\"/api/summary/types\")\nasync def summary_types():\n return [{\"id\": k, \"title\": v[\"title\"]} for k, v in SUMMARY_TYPES.items()]\n\n\n@app.post(\"/api/summary/generate\")\nasync def generate_summary(type: str = \"day_recap\", d: str | None = None):\n result = gen_summary(type, _parse_date(d))\n return result","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"cli.py","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"cli.py","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"131 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"#!/usr/bin/env python3\n\"\"\"Screenpipe CLI — run summaries and reports on demand.\"\"\"\nimport os\nimport sys\nfrom datetime import date, timedelta\n\nimport click\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nsys.path.insert(0, os.path.dirname(__file__))\n\nfrom consumers.activity import app_time, window_time, summary_stats\nfrom consumers.ocr import search as ocr_search\nfrom consumers.audio import transcriptions\nfrom consumers.summary import generate as gen_summary, SUMMARY_TYPES\n\n\ndef _resolve_date(d_str: str | None) -> date | None:\n if not d_str:\n return None\n if d_str == \"yesterday\":\n return date.today() - timedelta(days=1)\n if d_str == \"today\":\n return date.today()\n return date.fromisoformat(d_str)\n\n\n@click.group()\ndef cli():\n \"\"\"Screenpipe data explorer and summariser.\"\"\"\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--type\", \"-t\", \"summary_type\", default=\"day_recap\",\n type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)\ndef summary(d, summary_type):\n \"\"\"Generate an AI summary for a date (default: today).\"\"\"\n target = _resolve_date(d)\n click.echo(f\"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...\")\n result = gen_summary(summary_type, target)\n click.echo(f\"\\n{'─'*60}\")\n click.echo(f\" {result['title']} — {result['date']}\")\n click.echo(f\"{'─'*60}\\n\")\n click.echo(result[\"content\"])\n if \"stats\" in result:\n s = result[\"stats\"]\n click.echo(f\"\\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, \"\n f\"{s['audio_segments']} audio segments]\")\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--app\", \"-a\", default=None, help=\"Filter by app name\")\n@click.option(\"--windows\", \"-w\", is_flag=True, help=\"Show window breakdown instead of apps\")\ndef activity(d, app, windows):\n \"\"\"Show time spent per app or window.\"\"\"\n target = _resolve_date(d)\n label = str(target or date.today())\n\n if windows or app:\n rows = window_time(target, app)\n click.echo(f\"\\nWindow time — {label}\" + (f\" [{app}]\" if app else \"\"))\n click.echo(f\"{'App':<25} {'Window':<40} {'Min':>6}\")\n click.echo(\"─\" * 75)\n for r in rows:\n click.echo(f\"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}\")\n else:\n rows = app_time(target)\n stats = summary_stats(target)\n click.echo(f\"\\nApp time — {label}\")\n click.echo(f\"{'App':<30} {'Minutes':>8}\")\n click.echo(\"─\" * 40)\n for r in rows:\n click.echo(f\"{r['app_name']:<30} {r['minutes']:>8}\")\n click.echo(f\"\\nTotal frames: {stats['total_frames']} | \"\n f\"Active: {stats['first_seen']} → {stats['last_seen']}\")\n\n\n@cli.command()\n@click.argument(\"query\")\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\n@click.option(\"--audio\", is_flag=True, help=\"Search audio instead of screen text\")\n@click.option(\"--limit\", \"-n\", default=20, show_default=True)\ndef search(query, d, audio, limit):\n \"\"\"Search OCR screen text or audio transcriptions.\"\"\"\n from consumers.audio import search as audio_search_fn\n\n target = _resolve_date(d)\n if audio:\n rows = audio_search_fn(query, target, limit)\n click.echo(f\"\\nAudio results for '{query}':\")\n for r in rows:\n click.echo(f\" [{r['timestamp']}] {r['snippet']}\")\n else:\n rows = ocr_search(query, target, limit)\n click.echo(f\"\\nOCR results for '{query}':\")\n for r in rows:\n click.echo(f\" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}\")\n click.echo(f\" {r['snippet']}\")\n\n\n@cli.command()\n@click.option(\"--date\", \"-d\", \"d\", default=None, help=\"Date (YYYY-MM-DD, today, yesterday)\")\ndef audio(d):\n \"\"\"Show audio transcriptions for a date.\"\"\"\n target = _resolve_date(d)\n rows = transcriptions(target)\n if not rows:\n click.echo(\"No audio transcriptions found.\")\n return\n click.echo(f\"\\nAudio transcriptions — {target or date.today()}\")\n click.echo(\"─\" * 60)\n for r in rows:\n label = \"MIC\" if r[\"is_input_device\"] else \"SYS\"\n click.echo(f\"[{r['timestamp']}] [{label}] {r['transcription']}\")\n\n\n@cli.command()\ndef serve():\n \"\"\"Start the web UI (runs uvicorn on port 8000).\"\"\"\n import uvicorn\n click.echo(\"Starting Screenpipe dashboard at http://localhost:8000\")\n uvicorn.run(\"main:app\", host=\"0.0.0.0\", port=8000, reload=False)\n\n\nif __name__ == \"__main__\":\n cli()","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the frontend:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"438 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Screenpipe Dashboard</title>\n<style>\n :root {\n --bg: #0f0f11;\n --surface: #1a1a1f;\n --border: #2a2a35;\n --accent: #7c6fcd;\n --accent2: #4fa3e0;\n --text: #e0e0e8;\n --muted: #888899;\n --green: #4caf88;\n --red: #e06060;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { background: var(--bg); color: var(--text); font-family: 'Segoe UI', system-ui, sans-serif; font-size: 14px; }\n\n header {\n background: var(--surface);\n border-bottom: 1px solid var(--border);\n padding: 12px 24px;\n display: flex;\n align-items: center;\n gap: 16px;\n position: sticky;\n top: 0;\n z-index: 100;\n }\n header h1 { font-size: 16px; font-weight: 600; color: var(--accent); }\n header .spacer { flex: 1; }\n\n .date-picker { display: flex; align-items: center; gap: 8px; }\n .date-picker label { color: var(--muted); font-size: 12px; }\n input[type=\"date\"] {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 4px 8px;\n border-radius: 6px;\n font-size: 13px;\n }\n input[type=\"text\"] {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 13px;\n width: 200px;\n }\n input[type=\"text\"]:focus, input[type=\"date\"]:focus { outline: 1px solid var(--accent); }\n\n .tabs { display: flex; gap: 4px; }\n .tab {\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n color: var(--muted);\n font-size: 13px;\n border: 1px solid transparent;\n background: none;\n }\n .tab.active { background: var(--accent); color: white; }\n .tab:hover:not(.active) { background: var(--border); color: var(--text); }\n\n main { padding: 20px 24px; max-width: 1200px; margin: 0 auto; }\n\n .page { display: none; }\n .page.active { display: block; }\n\n .stats-bar {\n display: flex;\n gap: 16px;\n margin-bottom: 20px;\n flex-wrap: wrap;\n }\n .stat-card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 12px 16px;\n flex: 1;\n min-width: 150px;\n }\n .stat-card .label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; }\n .stat-card .value { font-size: 22px; font-weight: 700; color: var(--accent); margin-top: 4px; }\n .stat-card .sub { color: var(--muted); font-size: 11px; margin-top: 2px; }\n\n .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n @media (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }\n\n .card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 10px;\n padding: 16px;\n }\n .card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }\n\n .bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }\n .bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }\n .bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }\n .bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }\n .bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }\n\n table { width: 100%; border-collapse: collapse; font-size: 13px; }\n th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }\n td { padding: 6px 8px; border-bottom: 1px solid var(--border); }\n tr:last-child td { border-bottom: none; }\n tr:hover td { background: rgba(255,255,255,0.02); }\n\n .timeline-wrap { overflow-x: auto; }\n .timeline-grid { display: grid; gap: 2px; min-width: 600px; }\n .tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }\n .tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }\n .tl-cell {\n flex: 1;\n height: 20px;\n border-radius: 3px;\n background: var(--border);\n position: relative;\n cursor: default;\n font-size: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n color: white;\n }\n\n .summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }\n select {\n background: var(--bg);\n border: 1px solid var(--border);\n color: var(--text);\n padding: 6px 10px;\n border-radius: 6px;\n font-size: 13px;\n }\n button {\n background: var(--accent);\n color: white;\n border: none;\n padding: 8px 18px;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n }\n button:hover { opacity: 0.85; }\n button:disabled { opacity: 0.4; cursor: default; }\n\n .summary-output {\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 20px;\n white-space: pre-wrap;\n font-family: inherit;\n line-height: 1.6;\n min-height: 200px;\n color: var(--text);\n }\n .summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }\n .summary-output ul { padding-left: 20px; }\n .summary-output strong { color: var(--accent2); }\n\n .search-bar { display: flex; gap: 8px; margin-bottom: 16px; }\n .search-bar input[type=\"text\"] { flex: 1; }\n .search-bar select { }\n\n .result-item {\n border-bottom: 1px solid var(--border);\n padding: 10px 4px;\n }\n .result-item:last-child { border-bottom: none; }\n .result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }\n .result-snippet { font-size: 13px; }\n .result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }\n\n .audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }\n .audio-item:last-child { border-bottom: none; }\n .audio-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 4px;\n flex-shrink: 0;\n font-weight: 600;\n }\n .audio-badge.mic { background: rgba(76,175,136,0.2); color: var(--green); }\n .audio-badge.sys { background: rgba(74,163,224,0.2); color: var(--accent2); }\n .audio-ts { color: var(--muted); font-size: 11px; flex-shrink: 0; }\n\n .spinner { display: inline-block; width: 14px; height: 14px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.7s linear infinite; vertical-align: middle; margin-right: 6px; }\n @keyframes spin { to { transform: rotate(360deg); } }\n\n .empty { color: var(--muted); text-align: center; padding: 40px; font-size: 13px; }\n</style>\n</head>\n<body>\n\n<header>\n <h1>Screenpipe</h1>\n <div class=\"tabs\">\n <button class=\"tab active\" onclick=\"showPage('activity')\">Activity</button>\n <button class=\"tab\" onclick=\"showPage('search')\">Search</button>\n <button class=\"tab\" onclick=\"showPage('audio')\">Audio</button>\n <button class=\"tab\" onclick=\"showPage('summary')\">Summary</button>\n </div>\n <div class=\"spacer\"></div>\n <div class=\"date-picker\">\n <label>Date</label>\n <input type=\"date\" id=\"datePicker\" onchange=\"refresh()\">\n </div>\n</header>\n\n<main>\n\n<!-- ── Activity ─────────────────────────────────────────────── -->\n<div class=\"page active\" id=\"page-activity\">\n <div class=\"stats-bar\" id=\"statsBar\">\n <div class=\"stat-card\"><div class=\"label\">Frames</div><div class=\"value\" id=\"st-frames\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Apps</div><div class=\"value\" id=\"st-apps\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Audio Segs</div><div class=\"value\" id=\"st-audio\">–</div></div>\n <div class=\"stat-card\"><div class=\"label\">Active</div><div class=\"value\" id=\"st-first\" style=\"font-size:13px;margin-top:6px\">–</div><div class=\"sub\" id=\"st-last\">–</div></div>\n </div>\n <div class=\"grid-2\">\n <div class=\"card\">\n <h2>Time per App</h2>\n <div id=\"appBars\"><div class=\"empty\">Loading...</div></div>\n </div>\n <div class=\"card\">\n <h2>Windows</h2>\n <div id=\"windowTable\"><div class=\"empty\">Click an app bar to filter</div></div>\n </div>\n </div>\n</div>\n\n<!-- ── Search ───────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-search\">\n <div class=\"search-bar\">\n <input type=\"text\" id=\"searchQuery\" placeholder=\"Search screen text...\" onkeydown=\"if(event.key==='Enter') runSearch()\">\n <select id=\"searchTarget\">\n <option value=\"ocr\">Screen (OCR)</option>\n <option value=\"audio\">Audio</option>\n </select>\n <button onclick=\"runSearch()\">Search</button>\n </div>\n <div class=\"card\">\n <div id=\"searchResults\"><div class=\"empty\">Enter a query above to search screen text or audio transcriptions.</div></div>\n </div>\n</div>\n\n<!-- ── Audio ────────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-audio\">\n <div class=\"card\">\n <h2>Audio Transcriptions</h2>\n <div id=\"audioList\"><div class=\"empty\">Loading...</div></div>\n </div>\n</div>\n\n<!-- ── Summary ──────────────────────────────────────────────── -->\n<div class=\"page\" id=\"page-summary\">\n <div class=\"summary-controls\">\n <select id=\"summaryType\">\n <option value=\"day_recap\">Day Recap</option>\n <option value=\"standup\">Standup Update</option>\n <option value=\"focus_time\">Focus Analysis</option>\n </select>\n <button id=\"genBtn\" onclick=\"generateSummary()\">Generate</button>\n </div>\n <div class=\"summary-output\" id=\"summaryOutput\">\n Select a summary type and click Generate. Requires ANTHROPIC_API_KEY in your environment.\n </div>\n</div>\n\n</main>\n\n<script>\nconst API = '';\nlet currentPage = 'activity';\nlet currentApp = null;\n\n// ── Date ────────────────────────────────────────────────────────\nconst dp = document.getElementById('datePicker');\ndp.value = new Date().toISOString().slice(0, 10);\nfunction getDate() { return dp.value; }\n\nfunction refresh() {\n if (currentPage === 'activity') loadActivity();\n if (currentPage === 'audio') loadAudio();\n}\n\n// ── Page nav ────────────────────────────────────────────────────\nfunction showPage(name) {\n document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));\n document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));\n document.getElementById('page-' + name).classList.add('active');\n document.querySelectorAll('.tab')[['activity','search','audio','summary'].indexOf(name)].classList.add('active');\n currentPage = name;\n if (name === 'activity') loadActivity();\n if (name === 'audio') loadAudio();\n}\n\n// ── Activity ────────────────────────────────────────────────────\nasync function loadActivity() {\n const d = getDate();\n const [stats, apps] = await Promise.all([\n fetch(`${API}/api/stats?d=${d}`).then(r => r.json()),\n fetch(`${API}/api/activity/apps?d=${d}`).then(r => r.json()),\n ]);\n\n document.getElementById('st-frames').textContent = stats.total_frames ?? '–';\n document.getElementById('st-apps').textContent = stats.unique_apps ?? '–';\n document.getElementById('st-audio').textContent = stats.audio_segments ?? '–';\n document.getElementById('st-first').textContent = stats.first_seen ? fmtTime(stats.first_seen) : '–';\n document.getElementById('st-last').textContent = stats.last_seen ? '→ ' + fmtTime(stats.last_seen) : '';\n\n const max = apps[0]?.minutes || 1;\n const barsEl = document.getElementById('appBars');\n if (!apps.length) { barsEl.innerHTML = '<div class=\"empty\">No data</div>'; return; }\n\n barsEl.innerHTML = apps.slice(0, 20).map(a => `\n <div class=\"bar-item\" onclick=\"loadWindows('${esc(a.app_name)}')\" style=\"cursor:pointer\" title=\"Click to filter windows\">\n <div class=\"name\" title=\"${esc(a.app_name)}\">${esc(a.app_name)}</div>\n <div class=\"bar-wrap\"><div class=\"bar-fill\" style=\"width:${(a.minutes/max*100).toFixed(1)}%\"></div></div>\n <div class=\"mins\">${a.minutes}m</div>\n </div>`).join('');\n\n loadWindows(null);\n}\n\nasync function loadWindows(app) {\n currentApp = app;\n const d = getDate();\n const url = app ? `/api/activity/windows?d=${d}&app_name=${encodeURIComponent(app)}` : `/api/activity/windows?d=${d}`;\n const rows = await fetch(url).then(r => r.json());\n const el = document.getElementById('windowTable');\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No data</div>'; return; }\n el.innerHTML = `<table>\n <thead><tr><th>App</th><th>Window</th><th>Min</th></tr></thead>\n <tbody>${rows.slice(0,30).map(r => `\n <tr><td>${esc(r.app_name)}</td><td title=\"${esc(r.window_name||'')}\">${esc((r.window_name||'').slice(0,50))}</td><td>${r.minutes}</td></tr>\n `).join('')}</tbody>\n </table>`;\n}\n\n// ── Search ──────────────────────────────────────────────────────\nasync function runSearch() {\n const q = document.getElementById('searchQuery').value.trim();\n if (!q) return;\n const target = document.getElementById('searchTarget').value;\n const d = getDate();\n const el = document.getElementById('searchResults');\n el.innerHTML = '<div class=\"empty\"><span class=\"spinner\"></span>Searching...</div>';\n\n const url = target === 'audio'\n ? `/api/search/audio?q=${encodeURIComponent(q)}&d=${d}`\n : `/api/search/ocr?q=${encodeURIComponent(q)}&d=${d}`;\n\n const rows = await fetch(url).then(r => r.json()).catch(() => []);\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No results found.</div>'; return; }\n\n el.innerHTML = rows.map(r => `\n <div class=\"result-item\">\n <div class=\"result-meta\">${r.timestamp ? fmtTime(r.timestamp) : ''} · ${esc(r.app_name||'')} ${r.window_name ? '/ ' + esc(r.window_name) : ''}</div>\n <div class=\"result-snippet\">${highlightSnippet(r.snippet||'')}</div>\n </div>`).join('');\n}\n\nfunction highlightSnippet(s) {\n return esc(s).replace(/\\[/g, '<mark>').replace(/\\]/g, '</mark>');\n}\n\n// ── Audio ───────────────────────────────────────────────────────\nasync function loadAudio() {\n const d = getDate();\n const rows = await fetch(`${API}/api/audio?d=${d}`).then(r => r.json());\n const el = document.getElementById('audioList');\n if (!rows.length) { el.innerHTML = '<div class=\"empty\">No audio transcriptions for this date.</div>'; return; }\n el.innerHTML = rows.map(r => `\n <div class=\"audio-item\">\n <span class=\"audio-ts\">${fmtTime(r.timestamp)}</span>\n <span class=\"audio-badge ${r.is_input_device ? 'mic' : 'sys'}\">${r.is_input_device ? 'MIC' : 'SYS'}</span>\n <span>${esc(r.transcription)}</span>\n </div>`).join('');\n}\n\n// ── Summary ─────────────────────────────────────────────────────\nasync function generateSummary() {\n const type = document.getElementById('summaryType').value;\n const d = getDate();\n const btn = document.getElementById('genBtn');\n const out = document.getElementById('summaryOutput');\n btn.disabled = true;\n btn.innerHTML = '<span class=\"spinner\"></span>Generating...';\n out.textContent = 'Sending data to Claude...';\n\n const res = await fetch(`/api/summary/generate?type=${type}&d=${d}`, { method: 'POST' })\n .then(r => r.json()).catch(e => ({ content: 'Error: ' + e.message }));\n\n out.innerHTML = renderMarkdown(res.content || res.error || 'No content');\n btn.disabled = false;\n btn.textContent = 'Generate';\n}\n\n// ── Helpers ─────────────────────────────────────────────────────\nfunction esc(s) {\n return String(s||'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');\n}\n\nfunction fmtTime(ts) {\n if (!ts) return '';\n try {\n const d = new Date(ts);\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n } catch { return ts; }\n}\n\nfunction renderMarkdown(text) {\n return esc(text)\n .replace(/^## (.+)$/gm, '<h2>$1</h2>')\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/^- (.+)$/gm, '<li>$1</li>')\n .replace(/(<li>.*<\\/li>)/s, '<ul>$1</ul>')\n .replace(/\\n/g, '<br>');\n}\n\n// Init\nloadActivity();\n</script>\n</body>\n</html>","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Now the Docker Compose file:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"14 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"services:\n screenpipe-app:\n build: .\n container_name: screenpipe-app\n restart: unless-stopped\n ports:\n - \"8765:8000\"\n volumes:\n - /volume1/screenpipe/db.sqlite:/data/db.sqlite:ro\n env_file:\n - .env\n environment:\n TZ: Europe/Sofia","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"role_description":"text"},{"role":"AXLink","text":".env","depth":23,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"2 lines","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ANTHROPIC_API_KEY=your_key_here","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Now let's build and test:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Build Docker image","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cd /volume1/screenpipe/app && docker compose build 2>&1","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\npermission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head \"http://%2Fvar%2Frun%2Fdocker.sock/_ping\": dial unix /var/run/docker.sock: connect: permission denied\n[rerun: b10]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Build Docker image with sudo","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sudo docker compose -f /volume1/screenpipe/app/docker-compose.yml build 2>&1","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Exit code 1\nsudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper\nsudo: a password is required\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check current user and groups","depth":23,"role_description":"text"}]...
|
-8628379668759659158
|
-8187121230352777210
|
clipboard
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Shell Script
Editor Language Status: $(copilot) No inline suggestion available, Inline suggestions
LF
UTF-8
Spaces: 2
Ln 66, Col 1 (2524 selected)
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null
Copy code to clipboard
OUT
Exit code 1
[rerun: b4]
Bash
Bootstrap pip then install packages
IN
python3 -m ensurepip --upgrade 2>&1 && python3 -m pip install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -10
Copy code to clipboard
OUT
Exit code 1
/usr/bin/python3: No module named ensurepip
[rerun: b5]
Bash
Install pip via apt
IN
apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
OUT
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
[rerun: b6]
Bash
Install pip with sudo
Reason:
lets make it in docker, not to install it in nas directly
IN
sudo apt-get install -y python3-pip python3-venv 2>&1 | tail -5
Copy code to clipboard
Good call. Let me check what Docker setup you already have and build a proper containerized app.
Bash
Check existing docker-compose for reference
IN
ls /volume2/docker/paperlessngx/ && cat /volume2/docker/paperlessngx/docker-compose.yml 2>/dev/null | head -30
Copy code to clipboard
OUT
consume
data
db
docker-compose.yml
export
mcp-server
media
redis
trash
services:
redis:
image: redis:8
command:
- /bin/sh
- -c
- redis-server --requirepass redispass
container_name: PaperlessNGX-REDIS
hostname: paper-redis
security_opt:
- no-new-privileges:true
read_only: true
user: 1000:10
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
volumes:
- /volume2/docker/paperlessngx/redis:/data:rw
environment:
TZ: Europe/Sofia
restart: always
db:
image: postgres:17
container_name: PaperlessNGX-DB
hostname: paper-db
mem_limit: 1g
security_opt:
- no-new-privileges:true
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "paperless", "-U", "paperlessuser"]
[rerun: b7]
Bash
Check Docker availability
IN
docker --version && docker compose version 2>/dev/null
Copy code to clipboard
OUT
Docker version 26.1.0, build 9714adc
Docker Compose version v2.26.1
[rerun: b8]
Bash
Create app directory structure
IN
mkdir -p /volume1/screenpipe/app/consumers /volume1/screenpipe/app/static
Copy code to clipboard
OUT
[rerun: b9]
Now let me build everything. I'll create all the files:
Write
requirements.txt
requirements.txt
6 lines
fastapi==0.115.12
uvicorn[standard]==0.34.0
click==8.1.8
anthropic==0.49.0
python-dotenv==1.1.0
Write
Dockerfile
Dockerfile
13 lines
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "[IP_ADDRESS]", "--port", "8000"]
Write
db.py
db.py
28 lines
import sqlite3
from contextlib import contextmanager
from datetime import date, datetime, timedelta, timezone
from typing import Generator
DB_PATH = "/data/db.sqlite"
@contextmanager
def get_conn() -> Generator[sqlite3.Connection, None, None]:
conn = sqlite3.connect(f"file:{DB_PATH}?mode=ro", uri=True)
conn.row_factory = sqlite3.Row
try:
yield conn
finally:
conn.close()
def date_range(for_date: date) -> tuple[str, str]:
"""Return ISO timestamps for start/end of a given date (UTC)."""
start = datetime(for_date.year, for_date.month, for_date.day, tzinfo=timezone.utc)
end = start + timedelta(days=1)
return start.isoformat(), end.isoformat()
def today() -> date:
return datetime.now(timezone.utc).date()
Write
__init__.py
__init__.py
1 line
Write
activity.py
activity.py
123 lines
"""App usage and window focus time consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def app_time(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per app for a given date, sorted descending."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
o.app_name,
COUNT(*) as frame_count,
-- each frame ~ 2s at 0.5fps; convert to minutes
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY o.app_name
ORDER BY frame_count DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def window_time(for_date: date | None = None, app: str | None = None) -> list[dict[str, Any]]:
"""Return minutes spent per window/tab, optionally filtered by app."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
o.app_name,
o.window_name,
COUNT(*) as frame_count,
ROUND(COUNT(*) * 2.0 / 60, 1) as minutes
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
"""
params: list = [start, end]
if app:
query += " AND o.app_name = ?"
params.append(app)
query += " GROUP BY o.app_name, o.window_name ORDER BY frame_count DESC LIMIT 50"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def timeline(for_date: date | None = None, interval_minutes: int = 15) -> list[dict[str, Any]]:
"""Return activity bucketed into N-minute intervals."""
d = for_date or _today()
start, end = date_range(d)
interval_sec = interval_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
COUNT(*) as frames
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
GROUP BY bucket, o.app_name
ORDER BY bucket, frames DESC
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def summary_stats(for_date: date | None = None) -> dict[str, Any]:
"""Return high-level stats for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
frames_row = conn.execute(
"SELECT COUNT(*) as n, MIN(timestamp) as first, MAX(timestamp) as last "
"FROM frames WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
app_count = conn.execute(
"""
SELECT COUNT(DISTINCT o.app_name) as n
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ? AND o.app_name != ''
""",
(start, end),
).fetchone()
audio_count = conn.execute(
"SELECT COUNT(*) as n FROM audio_transcriptions "
"WHERE timestamp >= ? AND timestamp < ?",
(start, end),
).fetchone()
return {
"date": str(d),
"total_frames": frames_row["n"],
"first_seen": frames_row["first"],
"last_seen": frames_row["last"],
"unique_apps": app_count["n"],
"audio_segments": audio_count["n"],
}
Write
ocr.py
ocr.py
92 lines
"""OCR text search and aggregation consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def search(query: str, for_date: date | None = None, limit: int = 50) -> list[dict[str, Any]]:
"""Full-text search OCR content."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
f.timestamp,
o.app_name,
o.window_name,
snippet(ocr_text_fts, 0, '[', ']', '...', 20) as snippet
FROM ocr_text_fts
JOIN ocr_text o ON ocr_text_fts.rowid = o.rowid
JOIN frames f ON o.frame_id = f.id
WHERE ocr_text_fts MATCH ?
AND f.timestamp >= ? AND f.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def text_for_date(for_date: date | None = None, focused_only: bool = True) -> list[dict[str, Any]]:
"""Return all OCR text for a date, optionally only focused windows."""
d = for_date or _today()
start, end = date_range(d)
query = """
SELECT
f.timestamp,
o.app_name,
o.window_name,
o.text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
"""
params: list = [start, end]
if focused_only:
query += " AND o.focused = TRUE"
query += " ORDER BY f.timestamp"
with get_conn() as conn:
rows = conn.execute(query, params).fetchall()
return [dict(r) for r in rows]
def deduplicated_text(for_date: date | None = None, chunk_minutes: int = 5) -> list[dict[str, Any]]:
"""
Return OCR text deduplicated by time chunk + app to reduce LLM token usage.
Groups frames into N-minute buckets and returns one representative text per app per bucket.
"""
d = for_date or _today()
start, end = date_range(d)
interval_sec = chunk_minutes * 60
with get_conn() as conn:
rows = conn.execute(
f"""
SELECT
datetime(
(strftime('%s', f.timestamp) / {interval_sec}) * {interval_sec},
'unixepoch'
) as bucket,
o.app_name,
o.window_name,
substr(o.text, 1, 500) as text
FROM frames f
JOIN ocr_text o ON f.id = o.frame_id
WHERE f.timestamp >= ? AND f.timestamp < ?
AND o.app_name != ''
AND length(o.text) > 20
GROUP BY bucket, o.app_name
ORDER BY bucket
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
Write
audio.py
audio.py
61 lines
"""Audio transcription consumer."""
from datetime import date
from typing import Any
from db import get_conn, date_range, today as _today
def transcriptions(for_date: date | None = None) -> list[dict[str, Any]]:
"""Return all audio transcriptions for a date."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT timestamp, transcription, device, is_input_device, speaker_id
FROM audio_transcriptions
WHERE timestamp >= ? AND timestamp < ?
AND length(transcription) > 2
ORDER BY timestamp
""",
(start, end),
).fetchall()
return [dict(r) for r in rows]
def search(query: str, for_date: date | None = None, limit: int = 30) -> list[dict[str, Any]]:
"""Search audio transcriptions."""
d = for_date or _today()
start, end = date_range(d)
with get_conn() as conn:
rows = conn.execute(
"""
SELECT
a.timestamp,
a.device,
snippet(audio_transcriptions_fts, 0, '[', ']', '...', 20) as snippet
FROM audio_transcriptions_fts
JOIN audio_transcriptions a ON audio_transcriptions_fts.rowid = a.id
WHERE audio_transcriptions_fts MATCH ?
AND a.timestamp >= ? AND a.timestamp < ?
ORDER BY rank
LIMIT ?
""",
(query, start, end, limit),
).fetchall()
return [dict(r) for r in rows]
def formatted_transcript(for_date: date | None = None) -> str:
"""Return audio as a readable transcript string."""
rows = transcriptions(for_date)
if not rows:
return "(no audio transcriptions)"
lines = []
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
lines.append(f"[{r['timestamp']}] [{label}] {r['transcription']}")
return "\n".join(lines)
Write
summary.py
summary.py
162 lines
"""AI summary generator using Claude."""
import os
from datetime import date
from typing import Any
from consumers.activity import app_time, summary_stats
from consumers.ocr import deduplicated_text
from consumers.audio import formatted_transcript
SUMMARY_TYPES = {
"day_recap": {
"title": "Day Recap",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a concise day recap using EXACTLY this format:
## Summary
One sentence: what I mainly worked on today.
## Accomplishments
- Top 3 things I finished, with approximate times
- Name specific apps, files, or projects
## Key Moments
- Important things seen or heard, with timestamps
## Unfinished Work
- What to continue tomorrow
## Patterns
- Apps used most, topics that came up repeatedly
Only report what you can verify from the data. End with:
**Next step:** [most important thing to continue]""",
},
"standup": {
"title": "Standup Update",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
## Audio/speech:
{audio}
Write a brief standup update:
**Yesterday:** What I worked on (2-3 bullets)
**Today:** What I plan to continue (1-2 bullets)
**Blockers:** Any issues observed (or "None")
Keep it under 150 words. Only report what's verifiable from the data.""",
},
"focus_time": {
"title": "Focus & Distraction Analysis",
"prompt": """\
You are analyzing a person's computer activity for the day.
## App usage (minutes per app):
{app_time}
## Screen content (sampled every 5 minutes):
{ocr_text}
Analyze focus vs distraction patterns:
## Deep Work Periods
- When and how long were sustained focus sessions?
- What was being worked on?
## Distractions
- Which apps/sites were used recreationally?
- How much time was lost to context switching?
## Recommendations
- 2-3 concrete suggestions to improve focus tomorrow
Be specific with times and app names.""",
},
}
def _build_context(for_date: date) -> dict[str, str]:
apps = app_time(for_date)
app_lines = "\n".join(f"- {a['app_name']}: {a['minutes']} min" for a in apps[:20])
ocr_rows = deduplicated_text(for_date, chunk_minutes=5)
ocr_lines = "\n".join(
f"[{r['bucket']}] {r['app_name']} / {r['window_name'] or ''}: {r['text'][:200]}"
for r in ocr_rows[:100]
)
audio = formatted_transcript(for_date)
return {
"app_time": app_lines or "(no app data)",
"ocr_text": ocr_lines or "(no screen data)",
"audio": audio[:3000] if len(audio) > 3000 else audio,
}
def generate(
summary_type: str = "day_recap",
for_date: date | None = None,
api_key: str | None = None,
) -> dict[str, Any]:
"""Generate an AI summary. Returns dict with 'title', 'content', 'date'."""
import anthropic
d = for_date or date.today()
key = api_key or os.environ.get("ANTHROPIC_API_KEY", "")
if not key:
return {
"title": "Error",
"content": "ANTHROPIC_API_KEY not set. Add it to your .env file.",
"date": str(d),
}
spec = SUMMARY_TYPES.get(summary_type)
if not spec:
return {"title": "Error", "content": f"Unknown summary type: {summary_type}", "date": str(d)}
stats = summary_stats(d)
if stats["total_frames"] == 0:
return {
"title": spec["title"],
"content": f"No screen data found for {d}.",
"date": str(d),
}
ctx = _build_context(d)
prompt = spec["prompt"].format(**ctx)
client = anthropic.Anthropic(api_key=key)
message = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return {
"title": spec["title"],
"content": message.content[0].text,
"date": str(d),
"stats": stats,
}
Now the FastAPI backend and CLI:
Write
main.py
main.py
89 lines
"""Screenpipe dashboard — FastAPI web UI."""
import os
from datetime import date, datetime
from typing import Any
from dotenv import load_dotenv
from fastapi import FastAPI, Query
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
load_dotenv()
from consumers.activity import app_time, window_time, timeline, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions, search as audio_search
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
app = FastAPI(title="Screenpipe Dashboard")
app.mount("/static", StaticFiles(directory="static"), name="static")
def _parse_date(d: str | None) -> date | None:
if not d:
return None
try:
return date.fromisoformat(d)
except ValueError:
return None
@app.get("/", response_class=HTMLResponse)
async def index():
with open("static/index.html") as f:
return f.read()
# ── Activity ──────────────────────────────────────────────────────────────────
@app.get("/api/stats")
async def stats(d: str | None = Query(None)):
return summary_stats(_parse_date(d))
@app.get("/api/activity/apps")
async def activity_apps(d: str | None = Query(None)):
return app_time(_parse_date(d))
@app.get("/api/activity/windows")
async def activity_windows(d: str | None = Query(None), app_name: str | None = Query(None)):
return window_time(_parse_date(d), app_name)
@app.get("/api/activity/timeline")
async def activity_timeline(d: str | None = Query(None), interval: int = Query(15)):
return timeline(_parse_date(d), interval)
# ── Search ───────────────────────────────────────────────────────────────────
@app.get("/api/search/ocr")
async def search_ocr(q: str, d: str | None = Query(None), limit: int = 50):
return ocr_search(q, _parse_date(d), limit)
@app.get("/api/search/audio")
async def search_audio_endpoint(q: str, d: str | None = Query(None), limit: int = 30):
return audio_search(q, _parse_date(d), limit)
# ── Audio ─────────────────────────────────────────────────────────────────────
@app.get("/api/audio")
async def audio(d: str | None = Query(None)):
return transcriptions(_parse_date(d))
# ── Summaries ─────────────────────────────────────────────────────────────────
@app.get("/api/summary/types")
async def summary_types():
return [{"id": k, "title": v["title"]} for k, v in SUMMARY_TYPES.items()]
@app.post("/api/summary/generate")
async def generate_summary(type: str = "day_recap", d: str | None = None):
result = gen_summary(type, _parse_date(d))
return result
Write
cli.py
cli.py
131 lines
#!/usr/bin/env python3
"""Screenpipe CLI — run summaries and reports on demand."""
import os
import sys
from datetime import date, timedelta
import click
from dotenv import load_dotenv
load_dotenv()
sys.path.insert(0, os.path.dirname(__file__))
from consumers.activity import app_time, window_time, summary_stats
from consumers.ocr import search as ocr_search
from consumers.audio import transcriptions
from consumers.summary import generate as gen_summary, SUMMARY_TYPES
def _resolve_date(d_str: str | None) -> date | None:
if not d_str:
return None
if d_str == "yesterday":
return date.today() - timedelta(days=1)
if d_str == "today":
return date.today()
return date.fromisoformat(d_str)
@click.group()
def cli():
"""Screenpipe data explorer and summariser."""
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--type", "-t", "summary_type", default="day_recap",
type=click.Choice(list(SUMMARY_TYPES.keys())), show_default=True)
def summary(d, summary_type):
"""Generate an AI summary for a date (default: today)."""
target = _resolve_date(d)
click.echo(f"Generating {SUMMARY_TYPES[summary_type]['title']} for {target or date.today()}...")
result = gen_summary(summary_type, target)
click.echo(f"\n{'─'*60}")
click.echo(f" {result['title']} — {result['date']}")
click.echo(f"{'─'*60}\n")
click.echo(result["content"])
if "stats" in result:
s = result["stats"]
click.echo(f"\n[data: {s['total_frames']} frames, {s['unique_apps']} apps, "
f"{s['audio_segments']} audio segments]")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--app", "-a", default=None, help="Filter by app name")
@click.option("--windows", "-w", is_flag=True, help="Show window breakdown instead of apps")
def activity(d, app, windows):
"""Show time spent per app or window."""
target = _resolve_date(d)
label = str(target or date.today())
if windows or app:
rows = window_time(target, app)
click.echo(f"\nWindow time — {label}" + (f" [{app}]" if app else ""))
click.echo(f"{'App':<25} {'Window':<40} {'Min':>6}")
click.echo("─" * 75)
for r in rows:
click.echo(f"{r['app_name']:<25} {(r['window_name'] or '')[:40]:<40} {r['minutes']:>6}")
else:
rows = app_time(target)
stats = summary_stats(target)
click.echo(f"\nApp time — {label}")
click.echo(f"{'App':<30} {'Minutes':>8}")
click.echo("─" * 40)
for r in rows:
click.echo(f"{r['app_name']:<30} {r['minutes']:>8}")
click.echo(f"\nTotal frames: {stats['total_frames']} | "
f"Active: {stats['first_seen']} → {stats['last_seen']}")
@cli.command()
@click.argument("query")
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
@click.option("--audio", is_flag=True, help="Search audio instead of screen text")
@click.option("--limit", "-n", default=20, show_default=True)
def search(query, d, audio, limit):
"""Search OCR screen text or audio transcriptions."""
from consumers.audio import search as audio_search_fn
target = _resolve_date(d)
if audio:
rows = audio_search_fn(query, target, limit)
click.echo(f"\nAudio results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['snippet']}")
else:
rows = ocr_search(query, target, limit)
click.echo(f"\nOCR results for '{query}':")
for r in rows:
click.echo(f" [{r['timestamp']}] {r['app_name']} / {r['window_name'] or ''}")
click.echo(f" {r['snippet']}")
@cli.command()
@click.option("--date", "-d", "d", default=None, help="Date (YYYY-MM-DD, today, yesterday)")
def audio(d):
"""Show audio transcriptions for a date."""
target = _resolve_date(d)
rows = transcriptions(target)
if not rows:
click.echo("No audio transcriptions found.")
return
click.echo(f"\nAudio transcriptions — {target or date.today()}")
click.echo("─" * 60)
for r in rows:
label = "MIC" if r["is_input_device"] else "SYS"
click.echo(f"[{r['timestamp']}] [{label}] {r['transcription']}")
@cli.command()
def serve():
"""Start the web UI (runs uvicorn on port 8000)."""
import uvicorn
click.echo("Starting Screenpipe dashboard at [URL_WITH_CREDENTIALS] (max-width: 800px) { .grid-2 { grid-template-columns: 1fr; } }
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
padding: 16px;
}
.card h2 { font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 12px; }
.bar-item { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.bar-item .name { width: 130px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; }
.bar-item .bar-wrap { flex: 1; background: var(--border); border-radius: 4px; height: 12px; overflow: hidden; }
.bar-item .bar-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.4s; }
.bar-item .mins { width: 50px; text-align: right; color: var(--muted); font-size: 12px; }
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th { text-align: left; color: var(--muted); font-weight: 500; padding: 6px 8px; border-bottom: 1px solid var(--border); font-size: 11px; text-transform: uppercase; }
td { padding: 6px 8px; border-bottom: 1px solid var(--border); }
tr:last-child td { border-bottom: none; }
tr:hover td { background: rgba(255,255,255,0.02); }
.timeline-wrap { overflow-x: auto; }
.timeline-grid { display: grid; gap: 2px; min-width: 600px; }
.tl-row { display: flex; align-items: center; gap: 4px; margin-bottom: 2px; }
.tl-label { width: 70px; font-size: 11px; color: var(--muted); text-align: right; flex-shrink: 0; }
.tl-cell {
flex: 1;
height: 20px;
border-radius: 3px;
background: var(--border);
position: relative;
cursor: default;
font-size: 10px;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
color: white;
}
.summary-controls { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
select {
background: var(--bg);
border: 1px solid var(--border);
color: var(--text);
padding: 6px 10px;
border-radius: 6px;
font-size: 13px;
}
button {
background: var(--accent);
color: white;
border: none;
padding: 8px 18px;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
font-weight: 500;
}
button:hover { opacity: 0.85; }
button:disabled { opacity: 0.4; cursor: default; }
.summary-output {
background: var(--bg);
border: 1px solid var(--border);
border-radius: 8px;
padding: 20px;
white-space: pre-wrap;
font-family: inherit;
line-height: 1.6;
min-height: 200px;
color: var(--text);
}
.summary-output h2 { font-size: 15px; color: var(--accent); margin: 12px 0 6px; }
.summary-output ul { padding-left: 20px; }
.summary-output strong { color: var(--accent2); }
.search-bar { display: flex; gap: 8px; margin-bottom: 16px; }
.search-bar input[type="text"] { flex: 1; }
.search-bar select { }
.result-item {
border-bottom: 1px solid var(--border);
padding: 10px 4px;
}
.result-item:last-child { border-bottom: none; }
.result-meta { font-size: 11px; color: var(--muted); margin-bottom: 4px; }
.result-snippet { font-size: 13px; }
.result-snippet mark { background: rgba(124,111,205,0.3); color: var(--accent); border-radius: 2px; }
.audio-item { padding: 8px 4px; border-bottom: 1px solid var(--border); display: flex; gap: 10px; }
.audio-item:last-child { border-bottom: none; }
.audio-badge {
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
flex-shrink: 0;
font-wei...
|
NULL
|
|
1442
|
32
|
11
|
2026-04-11T17:28:28.434089+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928508434_m1.jpg...
|
Code
|
Build screenpipe data UI… — screenpipe [SSH: 100.7 Build screenpipe data UI… — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":26,"role_description":"text"},{"role":"AXStaticText","text":"ai-habits","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"day-recap","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"meeting-summary","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"standup-update","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"time-breakdown","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"video-export","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Build screenpipe data UI…, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Info: Setting up SSH Host 100.73.206.126: Setting up SSH tunnel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Build screenpipe data UI and summary app","depth":18,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"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":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Let me explore the screenpipe directory to understand what we're working with.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List screenpipe directory contents","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"data\ndb.sqlite\npipes\n#recycle\n[rerun: b1]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List data and pipes directories","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09\n2026-04-11\nai-habits\nday-recap\nmeeting-summary\nstandup-update\ntime-breakdown\nvideo-export\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List tables in screenpipe SQLite database","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \".tables\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx\n[rerun: b3]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get ocr_text table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(ocr_text);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|frame_id|INTEGER|1||0\n1|text|TEXT|1||0\n2|text_json|TEXT|0||0\n3|app_name|TEXT|1|''|0\n4|ocr_engine|TEXT|1|'unknown'|0\n5|window_name|TEXT|0||0\n6|focused|BOOLEAN|0|FALSE|0\n7|text_length|INTEGER|0||0\n8|sync_id|TEXT|0||0\n9|synced_at|DATETIME|0||0\n[rerun: b4]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get audio_transcriptions table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(audio_transcriptions);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|audio_chunk_id|INTEGER|1||0\n2|offset_index|INTEGER|1||0\n3|timestamp|TIMESTAMP|1||0\n4|transcription|TEXT|1||0\n5|device|TEXT|1|''|0\n6|is_input_device|BOOLEAN|1|TRUE|0\n7|speaker_id|INTEGER|0||0\n8|transcription_engine|TEXT|1|'Whisper'|0\n9|start_time|REAL|0||0\n10|end_time|REAL|0||0\n11|text_length|INTEGER|0||0\n12|sync_id|TEXT|0||0\n13|synced_at|DATETIME|0||0\n[rerun: b5]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get frames, ui_events, video_chunks schemas","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|video_chunk_id|INTEGER|0|NULL|0\n2|offset_index|INTEGER|1|0|0\n3|timestamp|TIMESTAMP|1||0\n4|name|TEXT|0||0\n5|app_name|TEXT|0|NULL|0\n6|window_name|TEXT|0|NULL|0\n7|focused|BOOLEAN|0|NULL|0\n8|browser_url|TEXT|0|NULL|0\n9|device_name|TEXT|1|''|0\n10|sync_id|TEXT|0||0\n11|machine_id|TEXT|0||0\n12|synced_at|DATETIME|0||0\n13|snapshot_path|TEXT|0|NULL|0\n14|accessibility_text|TEXT|0|NULL|0\n15|accessibility_tree_json|TEXT|0|NULL|0\n16|content_hash|INTEGER|0|NULL|0\n17|simhash|INTEGER|0|NULL|0\n18|capture_trigger|TEXT|0|NULL|0\n19|text_source|TEXT|0|NULL|0\n20|cloud_blob_id|TEXT|0|NULL|0\n21|full_text|TEXT|0|NULL|0\n22|elements_ref_frame_id|INTEGER|0|NULL|0\n0|id|INTEGER|0||1\n1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0\n2|session_id|TEXT|0||0\n3|relative_ms|INTEGER|1|0|0\n4|event_type|TEXT|1||0\n5|x|INTEGER|0||0\n6|y|INTEGER|0||0\n7|delta_x|INTEGER|0||0\n8|delta_y|INTEGER|0||0\n9|button|INTEGER|0||0\n10|click_count|INTEGER|0||0\n11|key_code|INTEGER|0||0\n12|modifiers|INTEGER|0||0\n13|text_content|TEXT|0||0\n14|text_length|INTEGER|0||0\n15|app_name|TEXT|0||0\n16|app_pid|INTEGER|0||0\n17|window_title|TEXT|0||0\n18|browser_url|TEXT|0||0\n19|element_role|TEXT|0||0\n20|element_name|TEXT|0||0\n21|element_value|TEXT|0||0\n22|element_description|TEXT|0||0\n23|element_automation_id|TEXT|0||0\n24|element_bounds|TEXT|0||0\n25|frame_id|INTEGER|0||0\n26|sync_id|TEXT|0||0\n27|machine_id|TEXT|0||0\n28|synced_at|DATETIME|0||0\n0|id|INTEGER|0||1\n1|file_path|TEXT|1||0\n2|device_name|TEXT|1|''|0\n3|sync_id|TEXT|0||0\n4|machine_id|TEXT|0||0\n5|synced_at|DATETIME|0||0\n6|fps|REAL|1|0.5|0\n7|cloud_blob_id|TEXT|0|NULL|0\n[rerun: b6]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check data counts and date ranges","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*) FROM ocr_text;\" 2>/dev/null","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00\n3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00\n666\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Explore existing pipes for patterns","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Read day-recap pipe documentation","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cat /volume1/screenpipe/pipes/day-recap/pipe.md","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"---\nschedule: manual\nenabled: true\ntemplate: true\ntitle: Day Recap\ndescription: \"Today's accomplishments, key moments, and unfinished work\"\nicon: \"📋\"\nfeatured: true\n---\n\nAnalyze my screen and audio recordings from today (last 16 hours only). \n\nRead screenpipe skill first.\n\nUse this exact format:\n\n## Summary\nOne sentence: what I mainly did today.\n\n## Accomplishments\n- Top 3 things I finished, with timestamps (e.g. \"2:30 PM\")\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things I saw, said, or heard — with timestamps\n\n## Unfinished Work\n- What I should continue tomorrow — name the app/file/task\n\n## Patterns\n- Apps I used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with: \"**Next step:** [most important thing to continue]\"\n[rerun: b9]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample app names from frames","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Safari\nActivity Monitor\nDia\niTerm2\nControl Centre\nUserNotificationCenter\nFinder\nClaude\nSlack\nFirefox\nRaycast\nNetAuthAgent\nQuickTime Player\n[rerun: b10]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample joined frame+ocr data for today","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE\n2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER\n2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p\n2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p\n2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample recent audio transcriptions","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09T17:02:52+00:00|.|System Audio\n2026-04-09T16:59:22+00:00|Class is technically...|System Audio\n2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio\n[rerun: b12]","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Good data to work with. Here's what we have:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ocr_text","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Screen captures with OCR text, app name, window name (1135 frames so far)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"audio_transcriptions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Voice/system audio transcripts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ui_events","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Mouse/keyboard events with app context","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Raw video files","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Before I start building, a few quick questions:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Tech stack","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"AI summaries","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"What summaries matter most?","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Day recap (what apps/windows you used, key text seen)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"App time breakdown (time per app)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Audio/conversation recap","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Custom searchable timeline","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Here's the architecture I'm thinking:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"/volume1/screenpipe/app/\n├── main.py # FastAPI web UI\n├── cli.py # Click CLI: `python cli.py day-recap`\n├── db.py # Read-only queries against db.sqlite\n├── consumers/\n│ ├── activity.py # App usage, time per window\n│ ├── ocr.py # OCR text aggregation + search\n│ ├── audio.py # Transcription queries\n│ └── summary.py # AI summary builder\n└── static/\n └── index.html # Single-page UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"CLI commands would look like:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"python cli.py day-recap # EOD summary\npython cli.py activity --date today # App time breakdown\npython cli.py search \"docker\" # Search OCR/audio text\npython cli.py serve # Launch web UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Does this direction work? Any preferences on the stack or which summaries to prioritize?","depth":22,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"seesm ok","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Python and available packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 --version && pip3 list 2>/dev/null | grep -E \"fastapi|uvicorn|click|anthropic|httpx|jinja\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Python 3.11.2\n[rerun: b1]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Verify join works for today's data","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"\nSELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len\nFROM frames f JOIN ocr_text o ON f.id = o.frame_id\nWHERE DATE(f.timestamp) = '2026-04-11'\nORDER BY f.timestamp DESC LIMIT 3;\n\"","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T12:54:42.597794+00:00|||2111\n2026-04-11T12:54:41.915916+00:00|||2110\n2026-04-11T12:54:39.912712+00:00|||2111\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install required packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"/bin/bash: line 1: pip3: command not found\n[rerun: b3]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Find pip","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"which pip || which pip3 || python3 -m pip --version 2>/dev/null","depth":24,"role_description":"text"}]...
|
4182593983178566583
|
3198426183633043462
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
ai-habits
pipe.md
day-recap
meeting-summary
standup-update
time-breakdown
video-export
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
Info: Setting up SSH Host [IP_ADDRESS]: Setting up SSH tunnel
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages
IN
pip3 install fastapi uvicorn click anthropic python-dotenv 2>&1 | tail -5
Copy code to clipboard
OUT
/bin/bash: line 1: pip3: command not found
[rerun: b3]
Bash
Find pip
IN
which pip || which pip3 || python3 -m pip --version 2>/dev/null...
|
NULL
|
|
1444
|
32
|
13
|
2026-04-11T17:28:34.258408+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928514258_m1.jpg...
|
Code
|
Build screenpipe data UI… — screenpipe [SSH: 100.7 Build screenpipe data UI… — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
__init__.py
activity.py
audio.py
ocr.py
report.py
summary.py
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
expanded
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"__init__.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"activity.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"audio.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"ocr.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"report.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"summary.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXTextArea","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":28,"value":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash\nDB=\"/volume1/Test/screenpipe/db.sqlite\"\nDATE=${1:-$(date -d \"yesterday\" '+%Y-%m-%d')}\n\necho \"═══════════════════════════════════════\"\necho \" SCREENPIPE REPORT — $DATE\"\necho \"═══════════════════════════════════════\"\n\necho -e \"\\n📱 APP USAGE (frames + estimated time)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n⌨️ ACTIVITY TYPE PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',\n app_name,\n SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),\n SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY app_name ORDER BY COUNT(*) DESC;\"\n\necho -e \"\\n🌐 BROWSER URLS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%4d frames %s', COUNT(*), browser_url)\nFROM frames\nWHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL\nGROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🪟 WINDOW TITLES (top 20)\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho -e \"\\n🕐 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho -e \"\\n📋 CLIPBOARD\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho -e \"\\n🔢 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\"\nsqlite3 \"$DB\" \"SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\"","depth":29,"role_description":"text"},{"role":"AXRadioButton","text":"Build screenpipe data UI…, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"expanded","depth":12,"role_description":"text"},{"role":"AXButton","text":"Build screenpipe data UI and summary app","depth":18,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"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":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Let me explore the screenpipe directory to understand what we're working with.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List screenpipe directory contents","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"data\ndb.sqlite\npipes\n#recycle\n[rerun: b1]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List data and pipes directories","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09\n2026-04-11\nai-habits\nday-recap\nmeeting-summary\nstandup-update\ntime-breakdown\nvideo-export\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List tables in screenpipe SQLite database","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \".tables\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx\n[rerun: b3]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get ocr_text table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(ocr_text);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|frame_id|INTEGER|1||0\n1|text|TEXT|1||0\n2|text_json|TEXT|0||0\n3|app_name|TEXT|1|''|0\n4|ocr_engine|TEXT|1|'unknown'|0\n5|window_name|TEXT|0||0\n6|focused|BOOLEAN|0|FALSE|0\n7|text_length|INTEGER|0||0\n8|sync_id|TEXT|0||0\n9|synced_at|DATETIME|0||0\n[rerun: b4]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get audio_transcriptions table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(audio_transcriptions);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|audio_chunk_id|INTEGER|1||0\n2|offset_index|INTEGER|1||0\n3|timestamp|TIMESTAMP|1||0\n4|transcription|TEXT|1||0\n5|device|TEXT|1|''|0\n6|is_input_device|BOOLEAN|1|TRUE|0\n7|speaker_id|INTEGER|0||0\n8|transcription_engine|TEXT|1|'Whisper'|0\n9|start_time|REAL|0||0\n10|end_time|REAL|0||0\n11|text_length|INTEGER|0||0\n12|sync_id|TEXT|0||0\n13|synced_at|DATETIME|0||0\n[rerun: b5]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get frames, ui_events, video_chunks schemas","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|video_chunk_id|INTEGER|0|NULL|0\n2|offset_index|INTEGER|1|0|0\n3|timestamp|TIMESTAMP|1||0\n4|name|TEXT|0||0\n5|app_name|TEXT|0|NULL|0\n6|window_name|TEXT|0|NULL|0\n7|focused|BOOLEAN|0|NULL|0\n8|browser_url|TEXT|0|NULL|0\n9|device_name|TEXT|1|''|0\n10|sync_id|TEXT|0||0\n11|machine_id|TEXT|0||0\n12|synced_at|DATETIME|0||0\n13|snapshot_path|TEXT|0|NULL|0\n14|accessibility_text|TEXT|0|NULL|0\n15|accessibility_tree_json|TEXT|0|NULL|0\n16|content_hash|INTEGER|0|NULL|0\n17|simhash|INTEGER|0|NULL|0\n18|capture_trigger|TEXT|0|NULL|0\n19|text_source|TEXT|0|NULL|0\n20|cloud_blob_id|TEXT|0|NULL|0\n21|full_text|TEXT|0|NULL|0\n22|elements_ref_frame_id|INTEGER|0|NULL|0\n0|id|INTEGER|0||1\n1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0\n2|session_id|TEXT|0||0\n3|relative_ms|INTEGER|1|0|0\n4|event_type|TEXT|1||0\n5|x|INTEGER|0||0\n6|y|INTEGER|0||0\n7|delta_x|INTEGER|0||0\n8|delta_y|INTEGER|0||0\n9|button|INTEGER|0||0\n10|click_count|INTEGER|0||0\n11|key_code|INTEGER|0||0\n12|modifiers|INTEGER|0||0\n13|text_content|TEXT|0||0\n14|text_length|INTEGER|0||0\n15|app_name|TEXT|0||0\n16|app_pid|INTEGER|0||0\n17|window_title|TEXT|0||0\n18|browser_url|TEXT|0||0\n19|element_role|TEXT|0||0\n20|element_name|TEXT|0||0\n21|element_value|TEXT|0||0\n22|element_description|TEXT|0||0\n23|element_automation_id|TEXT|0||0\n24|element_bounds|TEXT|0||0\n25|frame_id|INTEGER|0||0\n26|sync_id|TEXT|0||0\n27|machine_id|TEXT|0||0\n28|synced_at|DATETIME|0||0\n0|id|INTEGER|0||1\n1|file_path|TEXT|1||0\n2|device_name|TEXT|1|''|0\n3|sync_id|TEXT|0||0\n4|machine_id|TEXT|0||0\n5|synced_at|DATETIME|0||0\n6|fps|REAL|1|0.5|0\n7|cloud_blob_id|TEXT|0|NULL|0\n[rerun: b6]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check data counts and date ranges","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*) FROM ocr_text;\" 2>/dev/null","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00\n3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00\n666\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Explore existing pipes for patterns","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Read day-recap pipe documentation","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cat /volume1/screenpipe/pipes/day-recap/pipe.md","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"---\nschedule: manual\nenabled: true\ntemplate: true\ntitle: Day Recap\ndescription: \"Today's accomplishments, key moments, and unfinished work\"\nicon: \"📋\"\nfeatured: true\n---\n\nAnalyze my screen and audio recordings from today (last 16 hours only). \n\nRead screenpipe skill first.\n\nUse this exact format:\n\n## Summary\nOne sentence: what I mainly did today.\n\n## Accomplishments\n- Top 3 things I finished, with timestamps (e.g. \"2:30 PM\")\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things I saw, said, or heard — with timestamps\n\n## Unfinished Work\n- What I should continue tomorrow — name the app/file/task\n\n## Patterns\n- Apps I used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with: \"**Next step:** [most important thing to continue]\"\n[rerun: b9]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample app names from frames","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Safari\nActivity Monitor\nDia\niTerm2\nControl Centre\nUserNotificationCenter\nFinder\nClaude\nSlack\nFirefox\nRaycast\nNetAuthAgent\nQuickTime Player\n[rerun: b10]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample joined frame+ocr data for today","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE\n2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER\n2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p\n2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p\n2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample recent audio transcriptions","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09T17:02:52+00:00|.|System Audio\n2026-04-09T16:59:22+00:00|Class is technically...|System Audio\n2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio\n[rerun: b12]","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Good data to work with. Here's what we have:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ocr_text","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Screen captures with OCR text, app name, window name (1135 frames so far)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"audio_transcriptions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Voice/system audio transcripts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ui_events","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Mouse/keyboard events with app context","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Raw video files","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Before I start building, a few quick questions:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Tech stack","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"AI summaries","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"What summaries matter most?","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Day recap (what apps/windows you used, key text seen)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"App time breakdown (time per app)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Audio/conversation recap","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Custom searchable timeline","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Here's the architecture I'm thinking:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"/volume1/screenpipe/app/\n├── main.py # FastAPI web UI\n├── cli.py # Click CLI: `python cli.py day-recap`\n├── db.py # Read-only queries against db.sqlite\n├── consumers/\n│ ├── activity.py # App usage, time per window\n│ ├── ocr.py # OCR text aggregation + search\n│ ├── audio.py # Transcription queries\n│ └── summary.py # AI summary builder\n└── static/\n └── index.html # Single-page UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"CLI commands would look like:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"python cli.py day-recap # EOD summary\npython cli.py activity --date today # App time breakdown\npython cli.py search \"docker\" # Search OCR/audio text\npython cli.py serve # Launch web UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Does this direction work? Any preferences on the stack or which summaries to prioritize?","depth":22,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"seesm ok","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-4302382107043214347
|
3198478960193274374
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
__init__.py
activity.py
audio.py
ocr.py
report.py
summary.py
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
#!/bin/bash
DB="/volume1/Test/screenpipe/db.sqlite"
DATE=${1:-$(date -d "yesterday" '+%Y-%m-%d')}
echo "═══════════════════════════════════════"
echo " SCREENPIPE REPORT — $DATE"
echo "═══════════════════════════════════════"
echo -e "\n📱 APP USAGE (frames + estimated time)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-30s %5d frames ~%5.1f min', app_name, COUNT(*), ROUND(COUNT(*) * 4.5 / 60.0, 1))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n⌨️ ACTIVITY TYPE PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-25s clicks:%-5d keys:%-5d switches:%-4d',
app_name,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='key' THEN 1 ELSE 0 END),
SUM(CASE WHEN event_type='app_switch' THEN 1 ELSE 0 END))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY app_name ORDER BY COUNT(*) DESC;"
echo -e "\n🌐 BROWSER URLS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%4d frames %s', COUNT(*), browser_url)
FROM frames
WHERE date(timestamp) = '$DATE' AND browser_url IS NOT NULL
GROUP BY browser_url ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🪟 WINDOW TITLES (top 20)"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %3d %s', app_name, COUNT(*), SUBSTR(window_name,1,60))
FROM frames
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo -e "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo -e "\n📋 CLIPBOARD"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo -e "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "SELECT 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';"
sqlite3 "$DB" "SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';"
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
expanded
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking...
|
NULL
|
|
1447
|
32
|
16
|
2026-04-11T17:29:11.030056+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928551030_m1.jpg...
|
Code
|
Build screenpipe data UI… — screenpipe [SSH: 100.7 Build screenpipe data UI… — screenpipe [SSH: 100.73.206.126]...
|
True
|
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)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
__init__.py
activity.py
audio.py
ocr.py
report.py
summary.py
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
report.py, preview, Editor Group 1
report.py, preview, Editor Group 1
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
expanded
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages...
|
[{"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)","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":"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: 100.73.206.126]","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: 100.73.206.126]","depth":22,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: 100.73.206.126]","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":26,"role_description":"text"},{"role":"AXStaticText","text":"consumers","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"__init__.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"activity.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"audio.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"ocr.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"report.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"summary.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"static","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"cli.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"db.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Dockerfile","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"main.py","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"requirements.txt","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":"db.sqlite","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":"pipe.md, 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":"#!/bin/bash • Untitled-1, 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":"report.py, preview, Editor Group 1","depth":28,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"","depth":29,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"role_description":"text"},{"role":"AXTextArea","text":"report.py, preview, Editor Group 1","depth":28,"role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Build screenpipe data UI…, 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: 100.73.206.126","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: 100.73.206.126","depth":17,"role_description":"text"},{"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":"Update is ready, click to restart.","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":"Update is ready, click to restart.","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":"Sign In","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":"Sign In","depth":17,"role_description":"text"},{"role":"AXButton","text":"Screen Reader Optimized","depth":16,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"expanded","depth":12,"role_description":"text"},{"role":"AXButton","text":"Build screenpipe data UI and summary app","depth":18,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":18,"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":18,"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":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Let me explore the screenpipe directory to understand what we're working with.","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List screenpipe directory contents","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"data\ndb.sqlite\npipes\n#recycle\n[rerun: b1]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List data and pipes directories","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09\n2026-04-11\nai-habits\nday-recap\nmeeting-summary\nstandup-update\ntime-breakdown\nvideo-export\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"List tables in screenpipe SQLite database","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \".tables\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx\n[rerun: b3]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get ocr_text table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(ocr_text);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|frame_id|INTEGER|1||0\n1|text|TEXT|1||0\n2|text_json|TEXT|0||0\n3|app_name|TEXT|1|''|0\n4|ocr_engine|TEXT|1|'unknown'|0\n5|window_name|TEXT|0||0\n6|focused|BOOLEAN|0|FALSE|0\n7|text_length|INTEGER|0||0\n8|sync_id|TEXT|0||0\n9|synced_at|DATETIME|0||0\n[rerun: b4]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get audio_transcriptions table schema","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(audio_transcriptions);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|audio_chunk_id|INTEGER|1||0\n2|offset_index|INTEGER|1||0\n3|timestamp|TIMESTAMP|1||0\n4|transcription|TEXT|1||0\n5|device|TEXT|1|''|0\n6|is_input_device|BOOLEAN|1|TRUE|0\n7|speaker_id|INTEGER|0||0\n8|transcription_engine|TEXT|1|'Whisper'|0\n9|start_time|REAL|0||0\n10|end_time|REAL|0||0\n11|text_length|INTEGER|0||0\n12|sync_id|TEXT|0||0\n13|synced_at|DATETIME|0||0\n[rerun: b5]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Get frames, ui_events, video_chunks schemas","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"0|id|INTEGER|0||1\n1|video_chunk_id|INTEGER|0|NULL|0\n2|offset_index|INTEGER|1|0|0\n3|timestamp|TIMESTAMP|1||0\n4|name|TEXT|0||0\n5|app_name|TEXT|0|NULL|0\n6|window_name|TEXT|0|NULL|0\n7|focused|BOOLEAN|0|NULL|0\n8|browser_url|TEXT|0|NULL|0\n9|device_name|TEXT|1|''|0\n10|sync_id|TEXT|0||0\n11|machine_id|TEXT|0||0\n12|synced_at|DATETIME|0||0\n13|snapshot_path|TEXT|0|NULL|0\n14|accessibility_text|TEXT|0|NULL|0\n15|accessibility_tree_json|TEXT|0|NULL|0\n16|content_hash|INTEGER|0|NULL|0\n17|simhash|INTEGER|0|NULL|0\n18|capture_trigger|TEXT|0|NULL|0\n19|text_source|TEXT|0|NULL|0\n20|cloud_blob_id|TEXT|0|NULL|0\n21|full_text|TEXT|0|NULL|0\n22|elements_ref_frame_id|INTEGER|0|NULL|0\n0|id|INTEGER|0||1\n1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0\n2|session_id|TEXT|0||0\n3|relative_ms|INTEGER|1|0|0\n4|event_type|TEXT|1||0\n5|x|INTEGER|0||0\n6|y|INTEGER|0||0\n7|delta_x|INTEGER|0||0\n8|delta_y|INTEGER|0||0\n9|button|INTEGER|0||0\n10|click_count|INTEGER|0||0\n11|key_code|INTEGER|0||0\n12|modifiers|INTEGER|0||0\n13|text_content|TEXT|0||0\n14|text_length|INTEGER|0||0\n15|app_name|TEXT|0||0\n16|app_pid|INTEGER|0||0\n17|window_title|TEXT|0||0\n18|browser_url|TEXT|0||0\n19|element_role|TEXT|0||0\n20|element_name|TEXT|0||0\n21|element_value|TEXT|0||0\n22|element_description|TEXT|0||0\n23|element_automation_id|TEXT|0||0\n24|element_bounds|TEXT|0||0\n25|frame_id|INTEGER|0||0\n26|sync_id|TEXT|0||0\n27|machine_id|TEXT|0||0\n28|synced_at|DATETIME|0||0\n0|id|INTEGER|0||1\n1|file_path|TEXT|1||0\n2|device_name|TEXT|1|''|0\n3|sync_id|TEXT|0||0\n4|machine_id|TEXT|0||0\n5|synced_at|DATETIME|0||0\n6|fps|REAL|1|0.5|0\n7|cloud_blob_id|TEXT|0|NULL|0\n[rerun: b6]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check data counts and date ranges","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;\" 2>/dev/null\nsqlite3 /volume1/screenpipe/db.sqlite \"SELECT COUNT(*) FROM ocr_text;\" 2>/dev/null","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00\n3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00\n666\n[rerun: b7]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Explore existing pipes for patterns","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"pipe.md\n[rerun: b8]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Read day-recap pipe documentation","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"cat /volume1/screenpipe/pipes/day-recap/pipe.md","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"---\nschedule: manual\nenabled: true\ntemplate: true\ntitle: Day Recap\ndescription: \"Today's accomplishments, key moments, and unfinished work\"\nicon: \"📋\"\nfeatured: true\n---\n\nAnalyze my screen and audio recordings from today (last 16 hours only). \n\nRead screenpipe skill first.\n\nUse this exact format:\n\n## Summary\nOne sentence: what I mainly did today.\n\n## Accomplishments\n- Top 3 things I finished, with timestamps (e.g. \"2:30 PM\")\n- Name specific apps, files, or projects\n\n## Key Moments\n- Important things I saw, said, or heard — with timestamps\n\n## Unfinished Work\n- What I should continue tomorrow — name the app/file/task\n\n## Patterns\n- Apps I used most, topics that came up repeatedly\n\nOnly report what you can verify from the data. End with: \"**Next step:** [most important thing to continue]\"\n[rerun: b9]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample app names from frames","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Safari\nActivity Monitor\nDia\niTerm2\nControl Centre\nUserNotificationCenter\nFinder\nClaude\nSlack\nFirefox\nRaycast\nNetAuthAgent\nQuickTime Player\n[rerun: b10]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample joined frame+ocr data for today","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE\n2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER\n2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p\n2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p\n2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi\n[rerun: b11]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Sample recent audio transcriptions","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-09T17:02:52+00:00|.|System Audio\n2026-04-09T16:59:22+00:00|Class is technically...|System Audio\n2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio\n[rerun: b12]","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Good data to work with. Here's what we have:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ocr_text","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Screen captures with OCR text, app name, window name (1135 frames so far)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"audio_transcriptions","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Voice/system audio transcripts","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"ui_events","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Mouse/keyboard events with app context","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks","depth":24,"role_description":"text"},{"role":"AXStaticText","text":": Raw video files","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Before I start building, a few quick questions:","depth":22,"role_description":"text"},{"role":"AXStaticText","text":"Tech stack","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"AI summaries","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"What summaries matter most?","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Day recap (what apps/windows you used, key text seen)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"App time breakdown (time per app)","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Audio/conversation recap","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Custom searchable timeline","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Here's the architecture I'm thinking:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"/volume1/screenpipe/app/\n├── main.py # FastAPI web UI\n├── cli.py # Click CLI: `python cli.py day-recap`\n├── db.py # Read-only queries against db.sqlite\n├── consumers/\n│ ├── activity.py # App usage, time per window\n│ ├── ocr.py # OCR text aggregation + search\n│ ├── audio.py # Transcription queries\n│ └── summary.py # AI summary builder\n└── static/\n └── index.html # Single-page UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"CLI commands would look like:","depth":22,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":22,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"python cli.py day-recap # EOD summary\npython cli.py activity --date today # App time breakdown\npython cli.py search \"docker\" # Search OCR/audio text\npython cli.py serve # Launch web UI","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Does this direction work? Any preferences on the stack or which summaries to prioritize?","depth":22,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":23,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"seesm ok","depth":24,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":22,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Check Python and available packages","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"python3 --version && pip3 list 2>/dev/null | grep -E \"fastapi|uvicorn|click|anthropic|httpx|jinja\"","depth":24,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Python 3.11.2\n[rerun: b1]","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Verify join works for today's data","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"sqlite3 /volume1/screenpipe/db.sqlite \"\nSELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len\nFROM frames f JOIN ocr_text o ON f.id = o.frame_id\nWHERE DATE(f.timestamp) = '2026-04-11'\nORDER BY f.timestamp DESC LIMIT 3;\n\"","depth":25,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"2026-04-11T12:54:42.597794+00:00|||2111\n2026-04-11T12:54:41.915916+00:00|||2110\n2026-04-11T12:54:39.912712+00:00|||2111\n[rerun: b2]","depth":24,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":23,"role_description":"text"},{"role":"AXStaticText","text":"Install required packages","depth":23,"role_description":"text"}]...
|
-1760183978761483615
|
379311784822278753
|
idle
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
Explorer Section: screenpipe [SSH: [IP_ADDRESS]]
SCREENPIPE [SSH: [IP_ADDRESS]]
#recycle
app
consumers
__init__.py
activity.py
audio.py
ocr.py
report.py
summary.py
static
.env
cli.py
db.py
docker-compose.yml
Dockerfile
main.py
requirements.txt
data
pipes
db.sqlite
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
pipe.md, Editor Group 1
#!/bin/bash • Untitled-1, Editor Group 1
report.py, preview, Editor Group 1
report.py, preview, Editor Group 1
Build screenpipe data UI…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports
PORTS
remote SSH: [IP_ADDRESS]
SSH: [IP_ADDRESS]
No Problems
0
0
No Ports Forwarded
0
Update is ready, click to restart.
Update is ready, click to restart.
Notifications
Sign In
Sign In
Screen Reader Optimized
expanded
Build screenpipe data UI and summary app
Session history
New session
Message actions
lets build app around screenpipe data and db. THe idea is to have ui and data consumers. So I can run regular commands at the end ot the day (or on demand) and create soem summary.
Thinking
Thinking
Let me explore the screenpipe directory to understand what we're working with.
Bash
List screenpipe directory contents
IN
ls /volume1/screenpipe/
Copy code to clipboard
OUT
data
db.sqlite
pipes
#recycle
[rerun: b1]
Bash
List data and pipes directories
IN
ls /volume1/screenpipe/data/ | head -20 && ls /volume1/screenpipe/pipes/
Copy code to clipboard
OUT
2026-04-09
2026-04-11
ai-habits
day-recap
meeting-summary
standup-update
time-breakdown
video-export
[rerun: b2]
Bash
List tables in screenpipe SQLite database
IN
sqlite3 /volume1/screenpipe/db.sqlite ".tables"
Copy code to clipboard
OUT
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
[rerun: b3]
Bash
Get ocr_text table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(ocr_text);"
Copy code to clipboard
OUT
0|frame_id|INTEGER|1||0
1|text|TEXT|1||0
2|text_json|TEXT|0||0
3|app_name|TEXT|1|''|0
4|ocr_engine|TEXT|1|'unknown'|0
5|window_name|TEXT|0||0
6|focused|BOOLEAN|0|FALSE|0
7|text_length|INTEGER|0||0
8|sync_id|TEXT|0||0
9|synced_at|DATETIME|0||0
[rerun: b4]
Bash
Get audio_transcriptions table schema
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(audio_transcriptions);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|audio_chunk_id|INTEGER|1||0
2|offset_index|INTEGER|1||0
3|timestamp|TIMESTAMP|1||0
4|transcription|TEXT|1||0
5|device|TEXT|1|''|0
6|is_input_device|BOOLEAN|1|TRUE|0
7|speaker_id|INTEGER|0||0
8|transcription_engine|TEXT|1|'Whisper'|0
9|start_time|REAL|0||0
10|end_time|REAL|0||0
11|text_length|INTEGER|0||0
12|sync_id|TEXT|0||0
13|synced_at|DATETIME|0||0
[rerun: b5]
Bash
Get frames, ui_events, video_chunks schemas
IN
sqlite3 /volume1/screenpipe/db.sqlite "PRAGMA table_info(frames); PRAGMA table_info(ui_events); PRAGMA table_info(video_chunks);"
Copy code to clipboard
OUT
0|id|INTEGER|0||1
1|video_chunk_id|INTEGER|0|NULL|0
2|offset_index|INTEGER|1|0|0
3|timestamp|TIMESTAMP|1||0
4|name|TEXT|0||0
5|app_name|TEXT|0|NULL|0
6|window_name|TEXT|0|NULL|0
7|focused|BOOLEAN|0|NULL|0
8|browser_url|TEXT|0|NULL|0
9|device_name|TEXT|1|''|0
10|sync_id|TEXT|0||0
11|machine_id|TEXT|0||0
12|synced_at|DATETIME|0||0
13|snapshot_path|TEXT|0|NULL|0
14|accessibility_text|TEXT|0|NULL|0
15|accessibility_tree_json|TEXT|0|NULL|0
16|content_hash|INTEGER|0|NULL|0
17|simhash|INTEGER|0|NULL|0
18|capture_trigger|TEXT|0|NULL|0
19|text_source|TEXT|0|NULL|0
20|cloud_blob_id|TEXT|0|NULL|0
21|full_text|TEXT|0|NULL|0
22|elements_ref_frame_id|INTEGER|0|NULL|0
0|id|INTEGER|0||1
1|timestamp|DATETIME|1|CURRENT_TIMESTAMP|0
2|session_id|TEXT|0||0
3|relative_ms|INTEGER|1|0|0
4|event_type|TEXT|1||0
5|x|INTEGER|0||0
6|y|INTEGER|0||0
7|delta_x|INTEGER|0||0
8|delta_y|INTEGER|0||0
9|button|INTEGER|0||0
10|click_count|INTEGER|0||0
11|key_code|INTEGER|0||0
12|modifiers|INTEGER|0||0
13|text_content|TEXT|0||0
14|text_length|INTEGER|0||0
15|app_name|TEXT|0||0
16|app_pid|INTEGER|0||0
17|window_title|TEXT|0||0
18|browser_url|TEXT|0||0
19|element_role|TEXT|0||0
20|element_name|TEXT|0||0
21|element_value|TEXT|0||0
22|element_description|TEXT|0||0
23|element_automation_id|TEXT|0||0
24|element_bounds|TEXT|0||0
25|frame_id|INTEGER|0||0
26|sync_id|TEXT|0||0
27|machine_id|TEXT|0||0
28|synced_at|DATETIME|0||0
0|id|INTEGER|0||1
1|file_path|TEXT|1||0
2|device_name|TEXT|1|''|0
3|sync_id|TEXT|0||0
4|machine_id|TEXT|0||0
5|synced_at|DATETIME|0||0
6|fps|REAL|1|0.5|0
7|cloud_blob_id|TEXT|0|NULL|0
[rerun: b6]
Bash
Check data counts and date ranges
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM frames;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*), MIN(timestamp), MAX(timestamp) FROM audio_transcriptions;" 2>/dev/null
sqlite3 /volume1/screenpipe/db.sqlite "SELECT COUNT(*) FROM ocr_text;" 2>/dev/null
Copy code to clipboard
OUT
1135|2026-04-09T16:53:09.043761+00:00|2026-04-11T12:54:42.597794+00:00
3|2026-04-09T16:53:20+00:00|2026-04-09T17:02:52+00:00
666
[rerun: b7]
Bash
Explore existing pipes for patterns
IN
ls /volume1/screenpipe/pipes/day-recap/ 2>/dev/null && cat /volume1/screenpipe/pipes/day-recap/*.js 2>/dev/null | head -50
Copy code to clipboard
OUT
pipe.md
[rerun: b8]
Bash
Read day-recap pipe documentation
IN
cat /volume1/screenpipe/pipes/day-recap/pipe.md
Copy code to clipboard
OUT
---
schedule: manual
enabled: true
template: true
title: Day Recap
description: "Today's accomplishments, key moments, and unfinished work"
icon: "📋"
featured: true
---
Analyze my screen and audio recordings from today (last 16 hours only).
Read screenpipe skill first.
Use this exact format:
## Summary
One sentence: what I mainly did today.
## Accomplishments
- Top 3 things I finished, with timestamps (e.g. "2:30 PM")
- Name specific apps, files, or projects
## Key Moments
- Important things I saw, said, or heard — with timestamps
## Unfinished Work
- What I should continue tomorrow — name the app/file/task
## Patterns
- Apps I used most, topics that came up repeatedly
Only report what you can verify from the data. End with: "**Next step:** [most important thing to continue]"
[rerun: b9]
Bash
Sample app names from frames
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT DISTINCT app_name FROM frames WHERE app_name != '' LIMIT 20;"
Copy code to clipboard
OUT
Safari
Activity Monitor
Dia
iTerm2
Control Centre
UserNotificationCenter
Finder
Claude
Slack
Firefox
Raycast
NetAuthAgent
QuickTime Player
[rerun: b10]
Bash
Sample joined frame+ocr data for today
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT f.timestamp, o.app_name, o.window_name, substr(o.text, 1, 100) as text FROM frames f JOIN ocr_text o ON f.id = o.frame_id WHERE DATE(f.timestamp) = '2026-04-11' LIMIT 5;"
Copy code to clipboard
OUT
2026-04-11T11:53:00.627698+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <47H5Sat 11 Apr 14:53:00-zshDOCKE
2026-04-11T11:53:02.005967+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA-zsh100% <7H5Sat 11 Apr 14:53:01-zshDOCKER
2026-04-11T11:53:03.627468+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:03-zshDOCKERuse p
2026-04-11T11:53:05.528794+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <47Sat 11 Apr 14:53:05-zshDOCKERuse p
2026-04-11T11:53:07.662098+00:00|||iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ahlA100% <7Sat 11 Apr 14:53:07-zshDOCKERuse pi
[rerun: b11]
Bash
Sample recent audio transcriptions
IN
sqlite3 /volume1/screenpipe/db.sqlite "SELECT timestamp, substr(transcription,1,100) as text, device FROM audio_transcriptions ORDER BY timestamp DESC LIMIT 5;"
Copy code to clipboard
OUT
2026-04-09T17:02:52+00:00|.|System Audio
2026-04-09T16:59:22+00:00|Class is technically...|System Audio
2026-04-09T16:53:20+00:00|I do for you. Run the credit check. Deal apartment. Okay.|System Audio
[rerun: b12]
Thinking
Thinking
Good data to work with. Here's what we have:
frames
+
ocr_text
: Screen captures with OCR text, app name, window name (1135 frames so far)
audio_transcriptions
: Voice/system audio transcripts
ui_events
: Mouse/keyboard events with app context
video_chunks
: Raw video files
Before I start building, a few quick questions:
Tech stack
— Python OK? (FastAPI for the web UI backend, Click for CLI commands, HTMX for the frontend to keep it simple)
AI summaries
— Do you have a Claude API key to use for generating the actual summaries? Or should I integrate with a local model / skip AI for now?
What summaries matter most?
Day recap (what apps/windows you used, key text seen)
App time breakdown (time per app)
Audio/conversation recap
Custom searchable timeline
Here's the architecture I'm thinking:
Copy code to clipboard
/volume1/screenpipe/app/
├── main.py # FastAPI web UI
├── cli.py # Click CLI: `python cli.py day-recap`
├── db.py # Read-only queries against db.sqlite
├── consumers/
│ ├── activity.py # App usage, time per window
│ ├── ocr.py # OCR text aggregation + search
│ ├── audio.py # Transcription queries
│ └── summary.py # AI summary builder
└── static/
└── index.html # Single-page UI
CLI commands would look like:
Copy code to clipboard
python cli.py day-recap # EOD summary
python cli.py activity --date today # App time breakdown
python cli.py search "docker" # Search OCR/audio text
python cli.py serve # Launch web UI
Does this direction work? Any preferences on the stack or which summaries to prioritize?
Message actions
seesm ok
Thinking
Thinking
Bash
Check Python and available packages
IN
python3 --version && pip3 list 2>/dev/null | grep -E "fastapi|uvicorn|click|anthropic|httpx|jinja"
Copy code to clipboard
OUT
Python 3.11.2
[rerun: b1]
Bash
Verify join works for today's data
IN
sqlite3 /volume1/screenpipe/db.sqlite "
SELECT f.timestamp, o.app_name, o.window_name, length(o.text) as txt_len
FROM frames f JOIN ocr_text o ON f.id = o.frame_id
WHERE DATE(f.timestamp) = '2026-04-11'
ORDER BY f.timestamp DESC LIMIT 3;
"
Copy code to clipboard
OUT
2026-04-11T12:54:42.597794+00:00|||2111
2026-04-11T12:54:41.915916+00:00|||2110
2026-04-11T12:54:39.912712+00:00|||2111
[rerun: b2]
Bash
Install required packages...
|
1446
|
|
1448
|
32
|
17
|
2026-04-11T17:29:17.606275+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928557606_m1.jpg...
|
Firefox
|
Screenpipe Dashboard — Personal
|
True
|
http://100.73.206.126:8766
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
TOTAL SPAN
1.0h
14:52 → 15:54
ACTIVE
1.0h
BREAKS
0 breaks · 0.0h
SESSIONS
1
62m
FRAMES
612
APPS
6
UI EVENTS
1344
AUDIO
0
ACTIVE PERIOD
14:52 → 15:54
TIME PER APP
— CLICK TO FILTER RIGHT PANEL
iTerm2
5.2m
Firefox
1.5m
Finder
0.6m
QuickTime Player
0.5m
NetAuthAgent
0.1m
Raycast
0.1m
Websites
Windows
UI Events
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d
0.1m
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/
0.1m
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
0m
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com
0m...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe Dashboard","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":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe","depth":7,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"04","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"TOTAL SPAN","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52 → 15:54","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"BREAKS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0 breaks · 0.0h","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SESSIONS","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"62m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"FRAMES","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"612","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"APPS","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"UI EVENTS","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1344","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AUDIO","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ACTIVE PERIOD","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:52 → 15:54","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TIME PER APP","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"— CLICK TO FILTER RIGHT PANEL","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"iTerm2","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5.2m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1.5m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finder","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.6m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"QuickTime Player","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.5m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"NetAuthAgent","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Raycast","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Websites","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Windows","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"UI Events","depth":8,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.7m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"nas.lakylak.xyz/desktop/#/login/account","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"login.tailscale.com/login?next_url=%2Fadmin","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0.1m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"http://localhost:3030","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0m","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-817909191078697115
|
-5356146286853993268
|
app_switch
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Close tab
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe
Screenpipe
Activity
Search
Audio
Work Report
AI Summary
Date
11
/
04
/
2026
Calendar
TOTAL SPAN
1.0h
14:52 → 15:54
ACTIVE
1.0h
BREAKS
0 breaks · 0.0h
SESSIONS
1
62m
FRAMES
612
APPS
6
UI EVENTS
1344
AUDIO
0
ACTIVE PERIOD
14:52 → 15:54
TIME PER APP
— CLICK TO FILTER RIGHT PANEL
iTerm2
5.2m
Firefox
1.5m
Finder
0.6m
QuickTime Player
0.5m
NetAuthAgent
0.1m
Raycast
0.1m
Websites
Windows
UI Events
nas.lakylak.xyz/desktop/#/
0.7m
play.hbomax.com/video/watch/6b742798-e5fa-4f90-8beb-74c328dc5028/65d19c63-e85e-4392-8594-f0f2e0a1dc2d
0.1m
nas.lakylak.xyz/desktop/#/login/account
0.1m
login.tailscale.com/login?next_url=%2Fadmin
0.1m
dennikn.sk/5263377/lod-orion-uspesne-pristala-na-zemi-desat-veci-ktore-si-pamatat-na-misii-artemis-ii/
0.1m
http://localhost:3030
0m
addons.mozilla.org/en-US/firefox/addon/vimium-ff/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search
0m
accounts.google.com/v3/signin/accountchooser?access_type=offline&client_id=674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com&prompt=select_account&redirect_uri=https%3A%2F%2Flogin.tailscale.com%2Fa%2Foauth_response&response_type=code&scope=openid+email+profile&state=tc-ftYwP8oB0urJfQZeh42KPfA&dsh=S1949714251%3A1775911302074699&o2v=2&service=lso&flowName=GeneralOAuthFlow&opparams=%253F&continue=https%3A%2F%2Faccounts.google.com%2Fsignin%2Foauth%2Fconsent%3Fauthuser%3Dunknown%26part%3DAJi8hAOOoeMJ9h1ZWE-Aau2rWQdjwJ-4Enpv6Ci-0hiDSq5jW9TsVTl1btOELm96_EZaQdgfRwBdj1zZGB_CYauRC0fkTqY_cZ35H_NcJOU2_4Ax0Gtto-fKf-nDgh4daUIBqdTh68bjSxOce25-KnK0XYdHV8mzb69bNhDZHVDj_gb42yLS6CaLOtRfvBqDUDqR3SzLMQPfBkXHhJz6IM_7wq52TLTL563ihzeGQBECsxCnD1Yk27REW5r_eZ0TNXkkAX7P1hB8gAkBKuZVXHltsgP7jvfc8R1fsuXURwjdV8kBOMOg3Reld6-0t5nB9qwgvuYCJsuo0Q7IMz9o-t41651a_Wsc0FnlTxFC_0DA-eKXtSlPZHRy9BW_O_UgliMh8Y9cnLpKZ4r9A_LwCm6flXHR1tZWe_NA_YGhQ9EYSdByTuW1hMcIXXh1Alssc0Sb9BtxZ5mPnlLjTXaWd8LEtCrsHv1HQQ%26flowName%3DGeneralOAuthFlow%26as%3DS1949714251%253A1775911302074699%26client_id%3D674241127656-lmq9su4p8ni1tcpuh6eqidoornqtvmvi.apps.googleusercontent.com%26requestPath%3D%252Fsignin%252Foauth%252Fconsent%23&app_domain=https%3A%2F%2Flogin.tailscale.com
0m...
|
NULL
|
|
1450
|
32
|
19
|
2026-04-11T17:29:20.768288+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928560768_m1.jpg...
|
Firefox
|
Search results for "bitwarden" – Add-ons f Search results for "bitwarden" – Add-ons for Firefox (en-US) — Personal...
|
True
|
addons.mozilla.org/en-US/firefox/search/?q=bitward addons.mozilla.org/en-US/firefox/search/?q=bitwarden...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Close tab
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Firefox Browser Add-ons
Firefox Browser Add-ons
Extensions
Extensions
Themes
Themes
More…
More…
Firefox Add-ons Blog
Firefox Add-ons Blog
Extension Workshop
Extension Workshop
Developer Hub
Developer Hub
Log in
Log in
Search
bitwarden
bitwarden
bitwarden
Search
Search
11 results found for "bitwarden"
11 results found for "bitwarden"
Filter results
Filter results
Sort by
Add-on Type
Badging
Search results
Bitwarden Password Manager Recommended Recommended
Bitwarden Password Manager
Bitwarden Password Manager
Recommended Recommended
Recommended
Recommended
At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.
Rated 4.6 out of 5
Bitwarden Inc.
Bitwarden Inc.
965,377 users
965,377 users
Scout Vault
Scout Vault
Scout Vault
At home, at work, or on the go, Scout Vault easily secures all your passwords, passkeys, and sensitive information
There are no ratings yet
Scout Secured
Scout Secured
4 users
4 users
Sunsetvault
Sunsetvault
Sunsetvault
Sunsetvault is an exclusive build of the popular open source password manager, designed for internal use by SETG.
Rated 5 out of 5
Sunset
Sunset
12 users
12 users
Twake Pass
Twake Pass
Twake Pass
Twake Pass, the French and open source password manager application of your Twake Workplace that makes you the Internet easier by helping you to create, save and autofill strong passwords for all your accounts so you can browse securely online.
Rated 4.7 out of 5
Twake Workplace
Twake Workplace
1,045 users
1,045 users
Heimlane Vault
Heimlane Vault
Heimlane Vault
Password manager extension that securely stores, manages, and auto-fills login credentials for websites. Provides password generation and secure sharing capabilities.
There are no ratings yet
Heimlane
Heimlane
15 users
15 users
SAASPASS Password Manager & Authenticator 2FA SSO
SAASPASS Password Manager & Authenticator 2FA SSO
SAASPASS Password Manager & Authenticator 2FA SSO
SAASPASS is a free Password Manager & Authenticator [BACKUP_CODE]. There is NO need for a desktop application. You can use the Authenticator code generator & SAASPASS can autofill & autologin as well with single sign-on SSO
Rated 4.2 out of 5
SAASPASS
SAASPASS
260 users
260 users
Password Autofill Defocus
Password Autofill Defocus
Password Autofill Defocus
Defocuses password fields after auto-fill on HTTP pages, preventing Firefox's insecure login warning from blocking the login button.
There are no ratings yet
Nealon
Nealon
2 users
2 users
Authier
Authier
Authier
Authier chrome extension
There are no ratings yet
capaj
capaj
16 users
16 users
idrinth/walled-secrets
idrinth/walled-secrets
idrinth/walled-secrets
A small open source password manager.
Rated 5 out of 5
Björn 'Idrinth' Büttner
Björn 'Idrinth' Büttner
1 user
1 user
VivoKey Vault
VivoKey Vault
VivoKey Vault
A secure password manager, backed by the VivoKey Cryptobionic Identity.
There are no ratings yet
Riley Gall
Riley Gall
2 users
2 users
Overconfidence Password Generator
Overconfidence Password Generator
Overconfidence Password Generator
Create random, strong passwords that are extremely hard to crack and impossible to guess. Example: "nny考是込날ђປpማêầ누ျតस!%v"
There are no ratings yet
CRW1O1
CRW1O1
1 user
1 user
Go to Mozilla's homepage
Go to Mozilla's homepage
Add-ons
Add-ons
Add-ons
About
About
Firefox Add-ons Blog
Firefox Add-ons Blog
Extension Workshop
Extension Workshop
Developer Hub
Developer Hub
Developer Policies
Developer Policies
Community Blog
Community Blog
Forum
Forum
Report a bug
Report a bug
Review Guide
Review Guide
Browsers
Browsers
Desktop
Desktop
Mobile
Mobile
Enterprise
Enterprise
Products
Products
Browsers
Browsers
VPN
VPN
Relay
Relay
Monitor
Monitor
Pocket
Pocket
Bluesky (@firefox.com)
Bluesky (@firefox.com)
Instagram (Firefox)
Instagram (Firefox)
YouTube (firefoxchannel)
YouTube (firefoxchannel)
Privacy
Privacy
Cookies
Cookies
Legal
Legal
Except where otherwise
noted
noted
, content on this site is licensed under the
Creative Commons Attribution Share-Alike License v3.0
Creative Commons Attribution Share-Alike License v3.0
or any later version.
Change language...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Search results for \"bitwarden\" – Add-ons for Firefox (en-US)","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":"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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Firefox Browser Add-ons","depth":8,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Firefox Browser Add-ons","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Extensions","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Themes","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Themes","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More…","depth":11,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"More…","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Firefox Add-ons Blog","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Firefox Add-ons Blog","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Extension Workshop","depth":9,"help_text":"Learn how to create extensions and themes","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extension Workshop","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Developer Hub","depth":9,"help_text":"Submit and manage extensions and themes","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Developer Hub","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Log in","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Log in","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"bitwarden","depth":9,"value":"bitwarden","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"bitwarden","depth":10,"value":"bitwarden","help_text":"","placeholder":"Find add-ons","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"bitwarden","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"11 results found for \"bitwarden\"","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11 results found for \"bitwarden\"","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Filter results","depth":9,"help_text":"Toggle contents","role_description":"switch","subrole":"AXSwitch","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Filter results","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sort by","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add-on Type","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Badging","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search results","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Bitwarden Password Manager Recommended Recommended","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Bitwarden Password Manager","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Recommended Recommended","depth":12,"help_text":"Firefox only recommends add-ons that meet our standards for security and performance.","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Recommended","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Recommended","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rated 4.6 out of 5","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Bitwarden Inc.","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bitwarden Inc.","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"965,377 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"965,377 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Scout Vault","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Scout Vault","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Scout Vault","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"At home, at work, or on the go, Scout Vault easily secures all your passwords, passkeys, and sensitive information","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"There are no ratings yet","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Scout Secured","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Scout Secured","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"4 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Sunsetvault","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Sunsetvault","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sunsetvault","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sunsetvault is an exclusive build of the popular open source password manager, designed for internal use by SETG.","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rated 5 out of 5","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Sunset","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sunset","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"12 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Twake Pass","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Twake Pass","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Twake Pass","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Twake Pass, the French and open source password manager application of your Twake Workplace that makes you the Internet easier by helping you to create, save and autofill strong passwords for all your accounts so you can browse securely online.","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rated 4.7 out of 5","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Twake Workplace","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Twake Workplace","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1,045 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1,045 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Heimlane Vault","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Heimlane Vault","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Heimlane Vault","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Password manager extension that securely stores, manages, and auto-fills login credentials for websites. Provides password generation and secure sharing capabilities.","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"There are no ratings yet","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Heimlane","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Heimlane","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"15 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"SAASPASS Password Manager & Authenticator 2FA SSO","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"SAASPASS Password Manager & Authenticator 2FA SSO","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SAASPASS Password Manager & Authenticator 2FA SSO","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SAASPASS is a free Password Manager & Authenticator 2FA code generator. There is NO need for a desktop application. You can use the Authenticator code generator & SAASPASS can autofill & autologin as well with single sign-on SSO","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rated 4.2 out of 5","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"SAASPASS","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SAASPASS","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"260 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"260 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Password Autofill Defocus","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Password Autofill Defocus","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Password Autofill Defocus","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Defocuses password fields after auto-fill on HTTP pages, preventing Firefox's insecure login warning from blocking the login button.","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"There are no ratings yet","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Nealon","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Nealon","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"2 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Authier","depth":11,"bounds":{"left":0.5763889,"top":0.0,"width":0.41458333,"height":0.02111111},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Authier","depth":12,"bounds":{"left":0.5763889,"top":0.0,"width":0.03888889,"height":0.02111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Authier","depth":13,"bounds":{"left":0.5763889,"top":0.0,"width":0.03888889,"height":0.022222223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Authier chrome extension","depth":12,"bounds":{"left":0.5763889,"top":0.0,"width":0.11805555,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"There are no ratings yet","depth":13,"bounds":{"left":0.57569444,"top":0.0,"width":0.00625,"height":0.46333334},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"capaj","depth":11,"bounds":{"left":0.63958335,"top":0.0,"width":0.025,"height":0.018888889},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"capaj","depth":12,"bounds":{"left":0.63958335,"top":0.0,"width":0.025,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"16 users","depth":11,"bounds":{"left":0.99791664,"top":0.0,"width":0.0020833611,"height":0.06333333},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16 users","depth":12,"bounds":{"left":1.0,"top":0.0,"width":-0.0090277195,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"idrinth/walled-secrets","depth":11,"bounds":{"left":0.5763889,"top":0.05111111,"width":0.4236111,"height":0.02111111},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"idrinth/walled-secrets","depth":12,"bounds":{"left":0.5763889,"top":0.05111111,"width":0.11736111,"height":0.02111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"idrinth/walled-secrets","depth":13,"bounds":{"left":0.5763889,"top":0.05,"width":0.11736111,"height":0.022222223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A small open source password manager.","depth":12,"bounds":{"left":0.5763889,"top":0.07333333,"width":0.18541667,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rated 5 out of 5","depth":13,"bounds":{"left":0.57569444,"top":0.09555556,"width":0.00625,"height":0.27666667},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Björn 'Idrinth' Büttner","depth":11,"bounds":{"left":0.63958335,"top":0.09555556,"width":0.097222224,"height":0.018888889},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Björn 'Idrinth' Büttner","depth":12,"bounds":{"left":0.63958335,"top":0.094444446,"width":0.097222224,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1 user","depth":11,"bounds":{"left":1.0,"top":0.05111111,"width":-0.0090277195,"height":0.06333333},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1 user","depth":12,"bounds":{"left":1.0,"top":0.05,"width":-0.02013886,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"VivoKey Vault","depth":11,"bounds":{"left":0.5763889,"top":0.16888888,"width":0.41944444,"height":0.02111111},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"VivoKey Vault","depth":12,"bounds":{"left":0.5763889,"top":0.16888888,"width":0.072916664,"height":0.02111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"VivoKey Vault","depth":13,"bounds":{"left":0.5763889,"top":0.16777778,"width":0.072916664,"height":0.022222223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"A secure password manager, backed by the VivoKey Cryptobionic Identity.","depth":12,"bounds":{"left":0.5763889,"top":0.19111112,"width":0.30208334,"height":0.043333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"There are no ratings yet","depth":13,"bounds":{"left":0.57569444,"top":0.23666666,"width":0.00625,"height":0.46333334},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Riley Gall","depth":11,"bounds":{"left":0.63958335,"top":0.23666666,"width":0.041666668,"height":0.018888889},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Riley Gall","depth":12,"bounds":{"left":0.63958335,"top":0.23555556,"width":0.041666668,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"2 users","depth":11,"bounds":{"left":1.0,"top":0.16888888,"width":-0.0027778149,"height":0.086666666},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2 users","depth":12,"bounds":{"left":1.0,"top":0.16777778,"width":-0.013888836,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Overconfidence Password Generator","depth":11,"bounds":{"left":0.5763889,"top":0.31,"width":0.4236111,"height":0.02111111},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Overconfidence Password Generator","depth":12,"bounds":{"left":0.5763889,"top":0.31,"width":0.19652778,"height":0.02111111},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Overconfidence Password Generator","depth":13,"bounds":{"left":0.5763889,"top":0.30888888,"width":0.19652778,"height":0.022222223},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Create random, strong passwords that are extremely hard to crack and impossible to guess. Example: \"nny考是込날ђປpማêầ누ျតस!%v\"","depth":12,"bounds":{"left":0.5763889,"top":0.33222222,"width":0.30625,"height":0.053333335},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"There are no ratings yet","depth":13,"bounds":{"left":0.57569444,"top":0.37777779,"width":0.00625,"height":0.46333334},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"CRW1O1","depth":11,"bounds":{"left":0.63958335,"top":0.37777779,"width":0.03888889,"height":0.018888889},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CRW1O1","depth":12,"bounds":{"left":0.63958335,"top":0.37666667,"width":0.03888889,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1 user","depth":11,"bounds":{"left":1.0,"top":0.31,"width":-0.0090277195,"height":0.086666666},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1 user","depth":12,"bounds":{"left":1.0,"top":0.30888888,"width":-0.02013886,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to Mozilla's homepage","depth":9,"bounds":{"left":0.18541667,"top":0.5411111,"width":0.07777778,"height":0.043333333},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Go to Mozilla's homepage","depth":12,"bounds":{"left":0.18472221,"top":0.5422222,"width":0.011111111,"height":0.4577778},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Add-ons","depth":9,"bounds":{"left":0.41458333,"top":0.5411111,"width":0.22847222,"height":0.03},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Add-ons","depth":10,"bounds":{"left":0.41458333,"top":0.54333335,"width":0.052083332,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons","depth":11,"bounds":{"left":0.41458333,"top":0.54333335,"width":0.052083332,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"About","depth":11,"bounds":{"left":0.41458333,"top":0.58444446,"width":0.035416666,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"About","depth":12,"bounds":{"left":0.41458333,"top":0.58444446,"width":0.035416666,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Firefox Add-ons Blog","depth":11,"bounds":{"left":0.41458333,"top":0.6255556,"width":0.124305554,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Firefox Add-ons Blog","depth":12,"bounds":{"left":0.41458333,"top":0.6255556,"width":0.124305554,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Extension Workshop","depth":11,"bounds":{"left":0.41458333,"top":0.6666667,"width":0.12013889,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extension Workshop","depth":12,"bounds":{"left":0.41458333,"top":0.6666667,"width":0.12013889,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Developer Hub","depth":11,"bounds":{"left":0.41458333,"top":0.7077778,"width":0.0875,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Developer Hub","depth":12,"bounds":{"left":0.41458333,"top":0.7077778,"width":0.0875,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Developer Policies","depth":11,"bounds":{"left":0.41458333,"top":0.7488889,"width":0.108333334,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Developer Policies","depth":12,"bounds":{"left":0.41458333,"top":0.7488889,"width":0.108333334,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Community Blog","depth":11,"bounds":{"left":0.41458333,"top":0.79,"width":0.09652778,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Community Blog","depth":12,"bounds":{"left":0.41458333,"top":0.79,"width":0.09652778,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Forum","depth":11,"bounds":{"left":0.41458333,"top":0.83111113,"width":0.036805555,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Forum","depth":12,"bounds":{"left":0.41458333,"top":0.83111113,"width":0.036805555,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Report a bug","depth":11,"bounds":{"left":0.41458333,"top":0.87222224,"width":0.07638889,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Report a bug","depth":12,"bounds":{"left":0.41458333,"top":0.87222224,"width":0.07638889,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review Guide","depth":11,"bounds":{"left":0.41458333,"top":0.91333336,"width":0.07986111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review Guide","depth":12,"bounds":{"left":0.41458333,"top":0.91333336,"width":0.07986111,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Browsers","depth":9,"bounds":{"left":0.64305556,"top":0.5411111,"width":0.22916667,"height":0.03},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Browsers","depth":10,"bounds":{"left":0.64305556,"top":0.54333335,"width":0.056944445,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Desktop","depth":11,"bounds":{"left":0.64305556,"top":0.58444446,"width":0.049305554,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Desktop","depth":12,"bounds":{"left":0.64305556,"top":0.58444446,"width":0.049305554,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Mobile","depth":11,"bounds":{"left":0.64305556,"top":0.6255556,"width":0.039583333,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Mobile","depth":12,"bounds":{"left":0.64305556,"top":0.6255556,"width":0.039583333,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Enterprise","depth":11,"bounds":{"left":0.64305556,"top":0.6666667,"width":0.060416665,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enterprise","depth":12,"bounds":{"left":0.64305556,"top":0.6666667,"width":0.060416665,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Products","depth":9,"bounds":{"left":0.87222224,"top":0.5411111,"width":0.12777776,"height":0.03},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Products","depth":10,"bounds":{"left":0.87222224,"top":0.54333335,"width":0.054166667,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Browsers","depth":11,"bounds":{"left":0.87222224,"top":0.58444446,"width":0.05486111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browsers","depth":12,"bounds":{"left":0.87222224,"top":0.58444446,"width":0.05486111,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"VPN","depth":11,"bounds":{"left":0.87222224,"top":0.6255556,"width":0.025694445,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"VPN","depth":12,"bounds":{"left":0.87222224,"top":0.6255556,"width":0.025694445,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Relay","depth":11,"bounds":{"left":0.87222224,"top":0.6666667,"width":0.03125,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Relay","depth":12,"bounds":{"left":0.87222224,"top":0.6666667,"width":0.03125,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Monitor","depth":11,"bounds":{"left":0.87222224,"top":0.7077778,"width":0.045138888,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Monitor","depth":12,"bounds":{"left":0.87222224,"top":0.7077778,"width":0.045138888,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pocket","depth":11,"bounds":{"left":0.87222224,"top":0.7488889,"width":0.04027778,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pocket","depth":12,"bounds":{"left":0.87222224,"top":0.7488889,"width":0.04027778,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Bluesky (@firefox.com)","depth":11,"bounds":{"left":0.87222224,"top":0.8233333,"width":0.011111111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bluesky (@firefox.com)","depth":14,"bounds":{"left":0.8715278,"top":0.82666665,"width":0.011111111,"height":0.17333335},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Instagram (Firefox)","depth":11,"bounds":{"left":0.8972222,"top":0.8233333,"width":0.011111111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Instagram (Firefox)","depth":14,"bounds":{"left":0.89652777,"top":0.82666665,"width":0.010416667,"height":0.17333335},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"YouTube (firefoxchannel)","depth":11,"bounds":{"left":0.9222222,"top":0.8233333,"width":0.011111111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"YouTube (firefoxchannel)","depth":14,"bounds":{"left":0.9215278,"top":0.82666665,"width":0.007638889,"height":0.17333335},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Privacy","depth":10,"bounds":{"left":0.18541667,"top":0.99,"width":0.033333335,"height":0.00999999},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Privacy","depth":11,"bounds":{"left":0.18541667,"top":0.99,"width":0.033333335,"height":0.00999999},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Cookies","depth":10,"bounds":{"left":0.23958333,"top":0.99,"width":0.0375,"height":0.00999999},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Cookies","depth":11,"bounds":{"left":0.23958333,"top":0.99,"width":0.0375,"height":0.00999999},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Legal","depth":10,"bounds":{"left":0.29791668,"top":0.99,"width":0.025,"height":0.00999999},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Legal","depth":11,"bounds":{"left":0.29791668,"top":0.99,"width":0.025,"height":0.00999999},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Except where otherwise","depth":9,"bounds":{"left":0.18541667,"top":1.0,"width":0.11319444,"height":-0.046666622},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"noted","depth":9,"bounds":{"left":0.2986111,"top":1.0,"width":0.027083334,"height":-0.046666622},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"noted","depth":10,"bounds":{"left":0.2986111,"top":1.0,"width":0.027083334,"height":-0.046666622},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", content on this site is licensed under the","depth":9,"bounds":{"left":0.32569444,"top":1.0,"width":0.19444445,"height":-0.046666622},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Creative Commons Attribution Share-Alike License v3.0","depth":9,"bounds":{"left":0.52013886,"top":1.0,"width":0.25486112,"height":-0.046666622},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Creative Commons Attribution Share-Alike License v3.0","depth":10,"bounds":{"left":0.52013886,"top":1.0,"width":0.25486112,"height":-0.046666622},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"or any later version.","depth":9,"bounds":{"left":0.18541667,"top":1.0,"width":0.64375,"height":-0.046666622},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Change language","depth":10,"bounds":{"left":0.87222224,"top":1.0,"width":0.07986111,"height":-0.04222226},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
2233834825024307310
|
-5404837093853754236
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Search results for "bitwarden" – Add-ons for Firefox (en-US)
Close tab
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Firefox Browser Add-ons
Firefox Browser Add-ons
Extensions
Extensions
Themes
Themes
More…
More…
Firefox Add-ons Blog
Firefox Add-ons Blog
Extension Workshop
Extension Workshop
Developer Hub
Developer Hub
Log in
Log in
Search
bitwarden
bitwarden
bitwarden
Search
Search
11 results found for "bitwarden"
11 results found for "bitwarden"
Filter results
Filter results
Sort by
Add-on Type
Badging
Search results
Bitwarden Password Manager Recommended Recommended
Bitwarden Password Manager
Bitwarden Password Manager
Recommended Recommended
Recommended
Recommended
At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.
Rated 4.6 out of 5
Bitwarden Inc.
Bitwarden Inc.
965,377 users
965,377 users
Scout Vault
Scout Vault
Scout Vault
At home, at work, or on the go, Scout Vault easily secures all your passwords, passkeys, and sensitive information
There are no ratings yet
Scout Secured
Scout Secured
4 users
4 users
Sunsetvault
Sunsetvault
Sunsetvault
Sunsetvault is an exclusive build of the popular open source password manager, designed for internal use by SETG.
Rated 5 out of 5
Sunset
Sunset
12 users
12 users
Twake Pass
Twake Pass
Twake Pass
Twake Pass, the French and open source password manager application of your Twake Workplace that makes you the Internet easier by helping you to create, save and autofill strong passwords for all your accounts so you can browse securely online.
Rated 4.7 out of 5
Twake Workplace
Twake Workplace
1,045 users
1,045 users
Heimlane Vault
Heimlane Vault
Heimlane Vault
Password manager extension that securely stores, manages, and auto-fills login credentials for websites. Provides password generation and secure sharing capabilities.
There are no ratings yet
Heimlane
Heimlane
15 users
15 users
SAASPASS Password Manager & Authenticator 2FA SSO
SAASPASS Password Manager & Authenticator 2FA SSO
SAASPASS Password Manager & Authenticator 2FA SSO
SAASPASS is a free Password Manager & Authenticator [BACKUP_CODE]. There is NO need for a desktop application. You can use the Authenticator code generator & SAASPASS can autofill & autologin as well with single sign-on SSO
Rated 4.2 out of 5
SAASPASS
SAASPASS
260 users
260 users
Password Autofill Defocus
Password Autofill Defocus
Password Autofill Defocus
Defocuses password fields after auto-fill on HTTP pages, preventing Firefox's insecure login warning from blocking the login button.
There are no ratings yet
Nealon
Nealon
2 users
2 users
Authier
Authier
Authier
Authier chrome extension
There are no ratings yet
capaj
capaj
16 users
16 users
idrinth/walled-secrets
idrinth/walled-secrets
idrinth/walled-secrets
A small open source password manager.
Rated 5 out of 5
Björn 'Idrinth' Büttner
Björn 'Idrinth' Büttner
1 user
1 user
VivoKey Vault
VivoKey Vault
VivoKey Vault
A secure password manager, backed by the VivoKey Cryptobionic Identity.
There are no ratings yet
Riley Gall
Riley Gall
2 users
2 users
Overconfidence Password Generator
Overconfidence Password Generator
Overconfidence Password Generator
Create random, strong passwords that are extremely hard to crack and impossible to guess. Example: "nny考是込날ђປpማêầ누ျតस!%v"
There are no ratings yet
CRW1O1
CRW1O1
1 user
1 user
Go to Mozilla's homepage
Go to Mozilla's homepage
Add-ons
Add-ons
Add-ons
About
About
Firefox Add-ons Blog
Firefox Add-ons Blog
Extension Workshop
Extension Workshop
Developer Hub
Developer Hub
Developer Policies
Developer Policies
Community Blog
Community Blog
Forum
Forum
Report a bug
Report a bug
Review Guide
Review Guide
Browsers
Browsers
Desktop
Desktop
Mobile
Mobile
Enterprise
Enterprise
Products
Products
Browsers
Browsers
VPN
VPN
Relay
Relay
Monitor
Monitor
Pocket
Pocket
Bluesky (@firefox.com)
Bluesky (@firefox.com)
Instagram (Firefox)
Instagram (Firefox)
YouTube (firefoxchannel)
YouTube (firefoxchannel)
Privacy
Privacy
Cookies
Cookies
Legal
Legal
Except where otherwise
noted
noted
, content on this site is licensed under the
Creative Commons Attribution Share-Alike License v3.0
Creative Commons Attribution Share-Alike License v3.0
or any later version.
Change language...
|
NULL
|
|
1452
|
32
|
21
|
2026-04-11T17:29:33.323693+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775928573323_m1.jpg...
|
Firefox
|
Extensions – Add-ons for Firefox (en-US) — Persona Extensions – Add-ons for Firefox (en-US) — Personal...
|
True
|
addons.mozilla.org/en-US/firefox/extensions/
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
Close tab
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Firefox Browser Add-ons
Firefox Browser Add-ons
Extensions
Extensions
Themes
Themes
More…
More…
Firefox Add-ons Blog
Firefox Add-ons Blog
Extension Workshop
Extension Workshop
Developer Hub
Developer Hub
Log in
Log in
Search
Search
Search
Search
Search
Extensions
Extensions
Explore powerful tools and features to customize Firefox and make the browser all your own.
Categories
Alerts & Updates
Alerts & Updates
Appearance
Appearance
Bookmarks
Bookmarks
Download Management
Download Management
Feeds, News & Blogging
Feeds, News & Blogging
Games & Entertainment
Games & Entertainment
Language Support
Language Support
Other
Other
Photos, Music & Videos
Photos, Music & Videos
Privacy & Security
Privacy & Security
Search Tools
Search Tools
Shopping
Shopping
Social & Communication
Social & Communication
Tabs
Tabs
Web Development
Web Development
Recommended extensions
SingleFile
SingleFile
SingleFile
82,401 users
82,401 users
DuckDuckGo Search & Tracker Protection
DuckDuckGo Search & Tracker Protection
DuckDuckGo Search & Tracker Protection
1,159,712 users
1,159,712 users
Disconnect
Disconnect
Disconnect
66,417 users
66,417 users
Chrome Mask
Chrome Mask
Chrome Mask
50,236 users
50,236 users
See more recommended extensions
See more recommended extensions
Top rated extensions
SteamDB
SteamDB
SteamDB
101,356 users
101,356 users
LeechBlock NG
LeechBlock NG
LeechBlock NG
111,791 users
111,791 users
SponsorBlock - Skip Sponsorships on YouTube
SponsorBlock - Skip Sponsorships on YouTube
SponsorBlock - Skip Sponsorships on YouTube
736,901 users
736,901 users
Privacy Badger
Privacy Badger
Privacy Badger
1,890,491 users
1,890,491 users
See more top rated extensions
See more top rated extensions
Trending extensions
automaticDark - Time-Based Theme Changer
automaticDark - Time-Based Theme Changer
automaticDark - Time-Based Theme Changer
16,235 users
16,235 users
Time Tracker - Web Habit Builder
Time Tracker - Web Habit Builder
Time Tracker - Web Habit Builder
14,833 users
14,833 users
Download All Images
Download All Images
Download All Images
106,194 users
106,194 users
ClearURLs
ClearURLs
ClearURLs
520,769 users
520,769 users
See more trending extensions
See more trending extensions
Go to Mozilla's homepage
Go to Mozilla's homepage
Add-ons
Add-ons
Add-ons
About
About
Firefox Add-ons Blog
Firefox Add-ons Blog
Extension Workshop
Extension Workshop
Developer Hub
Developer Hub
Developer Policies
Developer Policies
Community Blog
Community Blog
Forum
Forum
Report a bug
Report a bug
Review Guide
Review Guide
Browsers
Browsers
Desktop
Desktop
Mobile
Mobile
Enterprise
Enterprise
Products
Products
Browsers
Browsers
VPN
VPN
Relay
Relay
Monitor
Monitor
Pocket
Pocket
Bluesky (@firefox.com)
Bluesky (@firefox.com)
Instagram (Firefox)
Instagram (Firefox)
YouTube (firefoxchannel)
YouTube (firefoxchannel)
Privacy
Privacy
Cookies
Cookies
Legal
Legal
Except where otherwise
noted
noted
, content on this site is licensed under the
Creative Commons Attribution Share-Alike License v3.0
Creative Commons Attribution Share-Alike License v3.0
or any later version.
Change language...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Inbox - kovaliklukas@gmail.com - Gmail","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Shameless • HBO Max","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shameless • HBO Max","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Settings","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"firefox sidebar - Google Search","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"firefox sidebar - Google Search","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"How to use AI-enhanced tab groups | Firefox Help","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"How to use AI-enhanced tab groups | Firefox Help","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Add-ons Manager","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons Manager","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Irán – Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Irán – Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Vimium Options","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vimium Options","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Machines - Tailscale","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Machines - Tailscale","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe Dashboard","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe Dashboard","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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":"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":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Browser Extension Getting Started | Bitwarden","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browser Extension Getting Started | Bitwarden","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Extensions – Add-ons for Firefox (en-US)","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions – Add-ons for Firefox (en-US)","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,"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":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Firefox Browser Add-ons","depth":8,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Firefox Browser Add-ons","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Extensions","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extensions","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Themes","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Themes","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More…","depth":11,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"More…","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Firefox Add-ons Blog","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Firefox Add-ons Blog","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Extension Workshop","depth":9,"help_text":"Learn how to create extensions and themes","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extension Workshop","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Developer Hub","depth":9,"help_text":"Submit and manage extensions and themes","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Developer Hub","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Log in","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Log in","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Search","depth":9,"value":"Search","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Search","depth":10,"help_text":"","placeholder":"Find add-ons","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":true,"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":"AXStaticText","text":"Search","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Extensions","depth":7,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Extensions","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Explore powerful tools and features to customize Firefox and make the browser all your own.","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Categories","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Alerts & Updates","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Alerts & Updates","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Appearance","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Appearance","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Bookmarks","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bookmarks","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Download Management","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Download Management","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Feeds, News & Blogging","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feeds, News & Blogging","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Games & Entertainment","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Games & Entertainment","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Language Support","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Language Support","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Other","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Other","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Photos, Music & Videos","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Photos, Music & Videos","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Privacy & Security","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Privacy & Security","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Search Tools","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Search Tools","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Shopping","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Shopping","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Social & Communication","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Social & Communication","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Tabs","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Tabs","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Web Development","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Web Development","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Recommended extensions","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"SingleFile","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"SingleFile","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SingleFile","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"82,401 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"82,401 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"DuckDuckGo Search & Tracker Protection","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"DuckDuckGo Search & Tracker Protection","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"DuckDuckGo Search & Tracker Protection","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1,159,712 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1,159,712 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Disconnect","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Disconnect","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Disconnect","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"66,417 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"66,417 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Chrome Mask","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Chrome Mask","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Chrome Mask","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"50,236 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"50,236 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more recommended extensions","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more recommended extensions","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Top rated extensions","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"SteamDB","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"SteamDB","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SteamDB","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"101,356 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"101,356 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"LeechBlock NG","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"LeechBlock NG","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LeechBlock NG","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"111,791 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"111,791 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"SponsorBlock - Skip Sponsorships on YouTube","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"SponsorBlock - Skip Sponsorships on YouTube","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SponsorBlock - Skip Sponsorships on YouTube","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"736,901 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"736,901 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Privacy Badger","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Privacy Badger","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Privacy Badger","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1,890,491 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1,890,491 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more top rated extensions","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more top rated extensions","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Trending extensions","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"automaticDark - Time-Based Theme Changer","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"automaticDark - Time-Based Theme Changer","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"automaticDark - Time-Based Theme Changer","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"16,235 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16,235 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Time Tracker - Web Habit Builder","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Time Tracker - Web Habit Builder","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Time Tracker - Web Habit Builder","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"14,833 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14,833 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Download All Images","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Download All Images","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Download All Images","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"106,194 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"106,194 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"ClearURLs","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"ClearURLs","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ClearURLs","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"520,769 users","depth":11,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"520,769 users","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"See more trending extensions","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"See more trending extensions","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to Mozilla's homepage","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Go to Mozilla's homepage","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Add-ons","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Add-ons","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add-ons","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"About","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"About","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Firefox Add-ons Blog","depth":11,"bounds":{"left":0.41458333,"top":0.0,"width":0.124305554,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Firefox Add-ons Blog","depth":12,"bounds":{"left":0.41458333,"top":0.0,"width":0.124305554,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Extension Workshop","depth":11,"bounds":{"left":0.41458333,"top":0.0,"width":0.12013889,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Extension Workshop","depth":12,"bounds":{"left":0.41458333,"top":0.0,"width":0.12013889,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Developer Hub","depth":11,"bounds":{"left":0.41458333,"top":0.02111111,"width":0.0875,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Developer Hub","depth":12,"bounds":{"left":0.41458333,"top":0.02111111,"width":0.0875,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Developer Policies","depth":11,"bounds":{"left":0.41458333,"top":0.062222224,"width":0.108333334,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Developer Policies","depth":12,"bounds":{"left":0.41458333,"top":0.062222224,"width":0.108333334,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Community Blog","depth":11,"bounds":{"left":0.41458333,"top":0.10333333,"width":0.09652778,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Community Blog","depth":12,"bounds":{"left":0.41458333,"top":0.10333333,"width":0.09652778,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Forum","depth":11,"bounds":{"left":0.41458333,"top":0.14444445,"width":0.036805555,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Forum","depth":12,"bounds":{"left":0.41458333,"top":0.14444445,"width":0.036805555,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Report a bug","depth":11,"bounds":{"left":0.41458333,"top":0.18555556,"width":0.07638889,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Report a bug","depth":12,"bounds":{"left":0.41458333,"top":0.18555556,"width":0.07638889,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review Guide","depth":11,"bounds":{"left":0.41458333,"top":0.22666667,"width":0.07986111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review Guide","depth":12,"bounds":{"left":0.41458333,"top":0.22666667,"width":0.07986111,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Browsers","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Browsers","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Desktop","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Desktop","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Mobile","depth":11,"bounds":{"left":0.64305556,"top":0.0,"width":0.039583333,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Mobile","depth":12,"bounds":{"left":0.64305556,"top":0.0,"width":0.039583333,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Enterprise","depth":11,"bounds":{"left":0.64305556,"top":0.0,"width":0.060416665,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enterprise","depth":12,"bounds":{"left":0.64305556,"top":0.0,"width":0.060416665,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Products","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Products","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Browsers","depth":11,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Browsers","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"VPN","depth":11,"bounds":{"left":0.87222224,"top":0.0,"width":0.025694445,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"VPN","depth":12,"bounds":{"left":0.87222224,"top":0.0,"width":0.025694445,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Relay","depth":11,"bounds":{"left":0.87222224,"top":0.0,"width":0.03125,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Relay","depth":12,"bounds":{"left":0.87222224,"top":0.0,"width":0.03125,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Monitor","depth":11,"bounds":{"left":0.87222224,"top":0.02111111,"width":0.045138888,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Monitor","depth":12,"bounds":{"left":0.87222224,"top":0.02111111,"width":0.045138888,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pocket","depth":11,"bounds":{"left":0.87222224,"top":0.062222224,"width":0.04027778,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pocket","depth":12,"bounds":{"left":0.87222224,"top":0.062222224,"width":0.04027778,"height":0.025555555},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Bluesky (@firefox.com)","depth":11,"bounds":{"left":0.87222224,"top":0.13666667,"width":0.011111111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Bluesky (@firefox.com)","depth":14,"bounds":{"left":0.8715278,"top":0.14,"width":0.011111111,"height":0.6255556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Instagram (Firefox)","depth":11,"bounds":{"left":0.8972222,"top":0.13666667,"width":0.011111111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Instagram (Firefox)","depth":14,"bounds":{"left":0.89652777,"top":0.14,"width":0.010416667,"height":0.53555554},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"YouTube (firefoxchannel)","depth":11,"bounds":{"left":0.9222222,"top":0.13666667,"width":0.011111111,"height":0.025555555},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"YouTube (firefoxchannel)","depth":14,"bounds":{"left":0.9215278,"top":0.14,"width":0.007638889,"height":0.6855556},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Privacy","depth":10,"bounds":{"left":0.18541667,"top":0.30333334,"width":0.033333335,"height":0.02},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Privacy","depth":11,"bounds":{"left":0.18541667,"top":0.30333334,"width":0.033333335,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Cookies","depth":10,"bounds":{"left":0.23958333,"top":0.30333334,"width":0.0375,"height":0.02},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Cookies","depth":11,"bounds":{"left":0.23958333,"top":0.30333334,"width":0.0375,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Legal","depth":10,"bounds":{"left":0.29791668,"top":0.30333334,"width":0.025,"height":0.02},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Legal","depth":11,"bounds":{"left":0.29791668,"top":0.30333334,"width":0.025,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Except where otherwise","depth":9,"bounds":{"left":0.18541667,"top":0.3611111,"width":0.11319444,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"noted","depth":9,"bounds":{"left":0.2986111,"top":0.3611111,"width":0.027083334,"height":0.02},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"noted","depth":10,"bounds":{"left":0.2986111,"top":0.3611111,"width":0.027083334,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", content on this site is licensed under the","depth":9,"bounds":{"left":0.32569444,"top":0.3611111,"width":0.19444445,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Creative Commons Attribution Share-Alike License v3.0","depth":9,"bounds":{"left":0.52013886,"top":0.3611111,"width":0.25486112,"height":0.02},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Creative Commons Attribution Share-Alike License v3.0","depth":10,"bounds":{"left":0.52013886,"top":0.3611111,"width":0.25486112,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"or any later version.","depth":9,"bounds":{"left":0.18541667,"top":0.3611111,"width":0.64375,"height":0.043333333},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Change language","depth":10,"bounds":{"left":0.87222224,"top":0.35555556,"width":0.07986111,"height":0.02},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
5863032855403197618
|
3869543555290386252
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameles DXP4800PLUS-B5F8
Inbox - [EMAIL] - Gmail
Shameless • HBO Max
Shameless • HBO Max
Settings
Settings
firefox sidebar - Google Search
firefox sidebar - Google Search
How to use AI-enhanced tab groups | Firefox Help
How to use AI-enhanced tab groups | Firefox Help
Add-ons Manager
Add-ons Manager
Vimium – Get this Extension for 🦊 Firefox (en-US)
Vimium – Get this Extension for 🦊 Firefox (en-US)
Irán – Denník N
Irán – Denník N
Vimium Options
Vimium Options
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Loď Orion úspešne pristála na Zemi. Desať vecí, ktoré si pamätať o misii Artemis II — Denník N
Machines - Tailscale
Machines - Tailscale
Screenpipe Dashboard
Screenpipe Dashboard
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
Close tab
New Tab
New Tab
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Bitwarden Password Manager – Get this Extension for 🦊 Firefox (en-US)
Browser Extension Getting Started | Bitwarden
Browser Extension Getting Started | Bitwarden
Extensions – Add-ons for Firefox (en-US)
Extensions – Add-ons for Firefox (en-US)
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Firefox Browser Add-ons
Firefox Browser Add-ons
Extensions
Extensions
Themes
Themes
More…
More…
Firefox Add-ons Blog
Firefox Add-ons Blog
Extension Workshop
Extension Workshop
Developer Hub
Developer Hub
Log in
Log in
Search
Search
Search
Search
Search
Extensions
Extensions
Explore powerful tools and features to customize Firefox and make the browser all your own.
Categories
Alerts & Updates
Alerts & Updates
Appearance
Appearance
Bookmarks
Bookmarks
Download Management
Download Management
Feeds, News & Blogging
Feeds, News & Blogging
Games & Entertainment
Games & Entertainment
Language Support
Language Support
Other
Other
Photos, Music & Videos
Photos, Music & Videos
Privacy & Security
Privacy & Security
Search Tools
Search Tools
Shopping
Shopping
Social & Communication
Social & Communication
Tabs
Tabs
Web Development
Web Development
Recommended extensions
SingleFile
SingleFile
SingleFile
82,401 users
82,401 users
DuckDuckGo Search & Tracker Protection
DuckDuckGo Search & Tracker Protection
DuckDuckGo Search & Tracker Protection
1,159,712 users
1,159,712 users
Disconnect
Disconnect
Disconnect
66,417 users
66,417 users
Chrome Mask
Chrome Mask
Chrome Mask
50,236 users
50,236 users
See more recommended extensions
See more recommended extensions
Top rated extensions
SteamDB
SteamDB
SteamDB
101,356 users
101,356 users
LeechBlock NG
LeechBlock NG
LeechBlock NG
111,791 users
111,791 users
SponsorBlock - Skip Sponsorships on YouTube
SponsorBlock - Skip Sponsorships on YouTube
SponsorBlock - Skip Sponsorships on YouTube
736,901 users
736,901 users
Privacy Badger
Privacy Badger
Privacy Badger
1,890,491 users
1,890,491 users
See more top rated extensions
See more top rated extensions
Trending extensions
automaticDark - Time-Based Theme Changer
automaticDark - Time-Based Theme Changer
automaticDark - Time-Based Theme Changer
16,235 users
16,235 users
Time Tracker - Web Habit Builder
Time Tracker - Web Habit Builder
Time Tracker - Web Habit Builder
14,833 users
14,833 users
Download All Images
Download All Images
Download All Images
106,194 users
106,194 users
ClearURLs
ClearURLs
ClearURLs
520,769 users
520,769 users
See more trending extensions
See more trending extensions
Go to Mozilla's homepage
Go to Mozilla's homepage
Add-ons
Add-ons
Add-ons
About
About
Firefox Add-ons Blog
Firefox Add-ons Blog
Extension Workshop
Extension Workshop
Developer Hub
Developer Hub
Developer Policies
Developer Policies
Community Blog
Community Blog
Forum
Forum
Report a bug
Report a bug
Review Guide
Review Guide
Browsers
Browsers
Desktop
Desktop
Mobile
Mobile
Enterprise
Enterprise
Products
Products
Browsers
Browsers
VPN
VPN
Relay
Relay
Monitor
Monitor
Pocket
Pocket
Bluesky (@firefox.com)
Bluesky (@firefox.com)
Instagram (Firefox)
Instagram (Firefox)
YouTube (firefoxchannel)
YouTube (firefoxchannel)
Privacy
Privacy
Cookies
Cookies
Legal
Legal
Except where otherwise
noted
noted
, content on this site is licensed under the
Creative Commons Attribution Share-Alike License v3.0
Creative Commons Attribution Share-Alike License v3.0
or any later version.
Change language...
|
NULL
|