|
83
|
8
|
1
|
2026-05-06T17:41:07.383276+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089267383_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
57
|
NULL
|
NULL
|
NULL
|
|
85
|
8
|
2
|
2026-05-06T17:41:38.295561+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089298295_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
57
|
NULL
|
NULL
|
NULL
|
|
87
|
8
|
3
|
2026-05-06T17:42:09.081439+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089329081_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
57
|
NULL
|
NULL
|
NULL
|
|
56
|
3
|
15
|
2026-05-06T17:34:22.349457+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088862349_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
manual
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
58
|
NULL
|
0
|
2026-05-06T17:34:55.443888+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088895443_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
60
|
5
|
0
|
2026-05-06T17:35:26.328902+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088926328_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
62
|
5
|
1
|
2026-05-06T17:35:57.089817+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088957089_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
64
|
5
|
2
|
2026-05-06T17:36:27.860681+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778088987860_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
66
|
5
|
3
|
2026-05-06T17:36:58.527517+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089018527_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
68
|
5
|
4
|
2026-05-06T17:37:29.194727+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089049194_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
70
|
5
|
5
|
2026-05-06T17:37:59.866251+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089079866_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
72
|
5
|
6
|
2026-05-06T17:38:30.848080+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089110848_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
74
|
5
|
7
|
2026-05-06T17:39:01.520984+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089141520_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
76
|
5
|
8
|
2026-05-06T17:39:32.629620+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089172629_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
78
|
NULL
|
0
|
2026-05-06T17:40:03.288414+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089203288_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
80
|
7
|
0
|
2026-05-06T17:40:34.520708+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089234520_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
82
|
7
|
1
|
2026-05-06T17:41:05.485689+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089265485_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
84
|
7
|
2
|
2026-05-06T17:41:36.562106+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089296562_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
86
|
7
|
3
|
2026-05-06T17:42:07.270568+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089327270_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-4581249978965508986
|
3190949638919044609
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
89
|
8
|
4
|
2026-05-06T17:42:40.293804+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089360293_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
3982245761352668008
|
2903862479982312961
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
57
|
NULL
|
NULL
|
NULL
|
|
88
|
7
|
4
|
2026-05-06T17:42:38.286953+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089358286_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
3982245761352668008
|
2903862479982312961
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
56
|
NULL
|
NULL
|
NULL
|
|
91
|
8
|
5
|
2026-05-06T17:43:11.156783+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089391156_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-5472190852642453105
|
2903862479982313089
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
90
|
7
|
5
|
2026-05-06T17:43:09.059709+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089389059_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-5472190852642453105
|
2903862479982313089
|
idle
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
110
|
8
|
14
|
2026-05-06T17:43:52.077454+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089432077_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-963159579927696681
|
2903862479982313089
|
click
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
108
|
NULL
|
NULL
|
NULL
|
|
112
|
8
|
15
|
2026-05-06T17:43:54.122949+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089434122_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
2521965691272282574
|
2903862479982313089
|
click
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
111
|
7
|
16
|
2026-05-06T17:43:53.657822+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778089433657_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
2521965691272282574
|
2903862479982313089
|
click
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
109
|
NULL
|
NULL
|
NULL
|
|
154
|
NULL
|
0
|
2026-05-06T18:02:04.973106+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778090524973_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 33504
drwxr-xr-x 91 lukas staff 2912 6 May 20:43 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg
-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg
-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg
-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg
-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg
-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg
-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg
-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg
-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg
-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg
-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg
-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg
-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg
-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg
-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg
-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg
-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg
-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg
-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg
-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg
-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg
-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg
-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg
-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 38952
drwxr-xr-x 81 lukas staff 2592 6 May 20:54 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg
-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg
-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg
-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg
-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg
-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg
-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg
-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg
-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg
-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg
-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg
-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg
-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg
-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg
-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg
-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg
-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg
-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg
-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg
-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg
-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg
-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg
-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg
-rw-r--r-- 1 lukas staff 163475 6 May 20:44 1778089447402_m2.jpg
-rw-r--r-- 1 lukas staff 225612 6 May 20:44 1778089448689_m1.jpg
-rw-r--r-- 1 lukas staff 163490 6 May 20:44 1778089480303_m2.jpg
-rw-r--r-- 1 lukas staff 225716 6 May 20:44 1778089481503_m1.jpg
-rw-r--r-- 1 lukas staff 163451 6 May 20:45 1778089511984_m2.jpg
-rw-r--r-- 1 lukas staff 225805 6 May 20:45 1778089512980_m1.jpg
-rw-r--r-- 1 lukas staff 163460 6 May 20:45 1778089544169_m2.jpg
-rw-r--r-- 1 lukas staff 225873 6 May 20:45 1778089545645_m1.jpg
-rw-r--r-- 1 lukas staff 163449 6 May 20:46 1778089575492_m2.jpg
-rw-r--r-- 1 lukas staff 225774 6 May 20:46 1778089577668_m1.jpg
-rw-r--r-- 1 lukas staff 163494 6 May 20:46 1778089607106_m2.jpg
-rw-r--r-- 1 lukas staff 225676 6 May 20:46 1778089609200_m1.jpg
-rw-r--r-- 1 lukas staff 163495 6 May 20:47 1778089638425_m2.jpg
-rw-r--r-- 1 lukas staff 225684 6 May 20:47 1778089640871_m1.jpg
-rw-r--r-- 1 lukas staff 163531 6 May 20:47 1778089670092_m2.jpg
-rw-r--r-- 1 lukas staff 225749 6 May 20:47 1778089672038_m1.jpg
-rw-r--r-- 1 lukas staff 163493 6 May 20:48 1778089701229_m2.jpg
-rw-r--r-- 1 lukas staff 225755 6 May 20:48 1778089703354_m1.jpg
-rw-r--r-- 1 lukas staff 163523 6 May 20:48 1778089732771_m2.jpg
-rw-r--r-- 1 lukas staff 225931 6 May 20:48 1778089734971_m1.jpg
-rw-r--r-- 1 lukas staff 163494 6 May 20:49 1778089764207_m2.jpg
-rw-r--r-- 1 lukas staff 225933 6 May 20:49 1778089766206_m1.jpg
-rw-r--r-- 1 lukas staff 163491 6 May 20:49 1778089795431_m2.jpg
-rw-r--r-- 1 lukas staff 225758 6 May 20:49 1778089797542_m1.jpg
-rw-r--r-- 1 lukas staff 163441 6 May 20:50 1778089827655_m2.jpg
-rw-r--r-- 1 lukas staff 225584 6 May 20:50 1778089828722_m1.jpg
-rw-r--r-- 1 lukas staff 163535 6 May 20:51 1778089859907_m2.jpg
-rw-r--r-- 1 lukas staff 225903 6 May 20:51 1778089861390_m1.jpg
-rw-r--r-- 1 lukas staff 163493 6 May 20:51 1778089891253_m2.jpg
-rw-r--r-- 1 lukas staff 225659 6 May 20:51 1778089893127_m1.jpg
-rw-r--r-- 1 lukas staff 163445 6 May 20:52 1778089922831_m2.jpg
-rw-r--r-- 1 lukas staff 225719 6 May 20:52 1778089925227_m1.jpg
-rw-r--r-- 1 lukas staff 163452 6 May 20:52 1778089954782_m2.jpg
-rw-r--r-- 1 lukas staff 225714 6 May 20:52 1778089956766_m1.jpg
-rw-r--r-- 1 lukas staff 163417 6 May 20:53 1778089985966_m2.jpg
-rw-r--r-- 1 lukas staff 225741 6 May 20:53 1778089988057_m1.jpg
-rw-r--r-- 1 lukas staff 163393 6 May 20:53 1778090017780_m2.jpg
-rw-r--r-- 1 lukas staff 225912 6 May 20:53 1778090019726_m1.jpg
-rw-r--r-- 1 lukas staff 163432 6 May 20:54 1778090049955_m2.jpg
-rw-r--r-- 1 lukas staff 225914 6 May 20:54 1778090052527_m1.jpg
-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 1600165 6 May 20:45 compact_monitor_1_1778089522686.mp4
-rw-r--r-- 1 lukas staff 352054 6 May 20:50 compact_monitor_1_1778089827658.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
-rw-r--r-- 1 lukas staff 1262068 6 May 20:45 compact_monitor_2_1778089524717.mp4
-rw-r--r-- 1 lukas staff 224813 6 May 20:50 compact_monitor_2_1778089828654.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll \ntotal 33504\ndrwxr-xr-x 91 lukas staff 2912 6 May 20:43 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg\n-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg\n-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg\n-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg\n-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg\n-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg\n-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg\n-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg\n-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg\n-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg\n-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg\n-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg\n-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg\n-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg\n-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg\n-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg\n-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg\n-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg\n-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg\n-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg\n-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg\n-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg\n-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg\n-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 38952\ndrwxr-xr-x 81 lukas staff 2592 6 May 20:54 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg\n-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg\n-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg\n-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg\n-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg\n-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg\n-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg\n-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg\n-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg\n-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg\n-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg\n-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg\n-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg\n-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg\n-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg\n-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg\n-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg\n-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg\n-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg\n-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg\n-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg\n-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg\n-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg\n-rw-r--r-- 1 lukas staff 163475 6 May 20:44 1778089447402_m2.jpg\n-rw-r--r-- 1 lukas staff 225612 6 May 20:44 1778089448689_m1.jpg\n-rw-r--r-- 1 lukas staff 163490 6 May 20:44 1778089480303_m2.jpg\n-rw-r--r-- 1 lukas staff 225716 6 May 20:44 1778089481503_m1.jpg\n-rw-r--r-- 1 lukas staff 163451 6 May 20:45 1778089511984_m2.jpg\n-rw-r--r-- 1 lukas staff 225805 6 May 20:45 1778089512980_m1.jpg\n-rw-r--r-- 1 lukas staff 163460 6 May 20:45 1778089544169_m2.jpg\n-rw-r--r-- 1 lukas staff 225873 6 May 20:45 1778089545645_m1.jpg\n-rw-r--r-- 1 lukas staff 163449 6 May 20:46 1778089575492_m2.jpg\n-rw-r--r-- 1 lukas staff 225774 6 May 20:46 1778089577668_m1.jpg\n-rw-r--r-- 1 lukas staff 163494 6 May 20:46 1778089607106_m2.jpg\n-rw-r--r-- 1 lukas staff 225676 6 May 20:46 1778089609200_m1.jpg\n-rw-r--r-- 1 lukas staff 163495 6 May 20:47 1778089638425_m2.jpg\n-rw-r--r-- 1 lukas staff 225684 6 May 20:47 1778089640871_m1.jpg\n-rw-r--r-- 1 lukas staff 163531 6 May 20:47 1778089670092_m2.jpg\n-rw-r--r-- 1 lukas staff 225749 6 May 20:47 1778089672038_m1.jpg\n-rw-r--r-- 1 lukas staff 163493 6 May 20:48 1778089701229_m2.jpg\n-rw-r--r-- 1 lukas staff 225755 6 May 20:48 1778089703354_m1.jpg\n-rw-r--r-- 1 lukas staff 163523 6 May 20:48 1778089732771_m2.jpg\n-rw-r--r-- 1 lukas staff 225931 6 May 20:48 1778089734971_m1.jpg\n-rw-r--r-- 1 lukas staff 163494 6 May 20:49 1778089764207_m2.jpg\n-rw-r--r-- 1 lukas staff 225933 6 May 20:49 1778089766206_m1.jpg\n-rw-r--r-- 1 lukas staff 163491 6 May 20:49 1778089795431_m2.jpg\n-rw-r--r-- 1 lukas staff 225758 6 May 20:49 1778089797542_m1.jpg\n-rw-r--r-- 1 lukas staff 163441 6 May 20:50 1778089827655_m2.jpg\n-rw-r--r-- 1 lukas staff 225584 6 May 20:50 1778089828722_m1.jpg\n-rw-r--r-- 1 lukas staff 163535 6 May 20:51 1778089859907_m2.jpg\n-rw-r--r-- 1 lukas staff 225903 6 May 20:51 1778089861390_m1.jpg\n-rw-r--r-- 1 lukas staff 163493 6 May 20:51 1778089891253_m2.jpg\n-rw-r--r-- 1 lukas staff 225659 6 May 20:51 1778089893127_m1.jpg\n-rw-r--r-- 1 lukas staff 163445 6 May 20:52 1778089922831_m2.jpg\n-rw-r--r-- 1 lukas staff 225719 6 May 20:52 1778089925227_m1.jpg\n-rw-r--r-- 1 lukas staff 163452 6 May 20:52 1778089954782_m2.jpg\n-rw-r--r-- 1 lukas staff 225714 6 May 20:52 1778089956766_m1.jpg\n-rw-r--r-- 1 lukas staff 163417 6 May 20:53 1778089985966_m2.jpg\n-rw-r--r-- 1 lukas staff 225741 6 May 20:53 1778089988057_m1.jpg\n-rw-r--r-- 1 lukas staff 163393 6 May 20:53 1778090017780_m2.jpg\n-rw-r--r-- 1 lukas staff 225912 6 May 20:53 1778090019726_m1.jpg\n-rw-r--r-- 1 lukas staff 163432 6 May 20:54 1778090049955_m2.jpg\n-rw-r--r-- 1 lukas staff 225914 6 May 20:54 1778090052527_m1.jpg\n-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 1600165 6 May 20:45 compact_monitor_1_1778089522686.mp4\n-rw-r--r-- 1 lukas staff 352054 6 May 20:50 compact_monitor_1_1778089827658.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\n-rw-r--r-- 1 lukas staff 1262068 6 May 20:45 compact_monitor_2_1778089524717.mp4\n-rw-r--r-- 1 lukas staff 224813 6 May 20:50 compact_monitor_2_1778089828654.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll \ntotal 33504\ndrwxr-xr-x 91 lukas staff 2912 6 May 20:43 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg\n-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg\n-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg\n-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg\n-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg\n-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg\n-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg\n-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg\n-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg\n-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg\n-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg\n-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg\n-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg\n-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg\n-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg\n-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg\n-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg\n-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg\n-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg\n-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg\n-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg\n-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg\n-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg\n-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 38952\ndrwxr-xr-x 81 lukas staff 2592 6 May 20:54 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg\n-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg\n-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg\n-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg\n-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg\n-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg\n-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg\n-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg\n-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg\n-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg\n-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg\n-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg\n-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg\n-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg\n-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg\n-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg\n-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg\n-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg\n-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg\n-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg\n-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg\n-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg\n-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg\n-rw-r--r-- 1 lukas staff 163475 6 May 20:44 1778089447402_m2.jpg\n-rw-r--r-- 1 lukas staff 225612 6 May 20:44 1778089448689_m1.jpg\n-rw-r--r-- 1 lukas staff 163490 6 May 20:44 1778089480303_m2.jpg\n-rw-r--r-- 1 lukas staff 225716 6 May 20:44 1778089481503_m1.jpg\n-rw-r--r-- 1 lukas staff 163451 6 May 20:45 1778089511984_m2.jpg\n-rw-r--r-- 1 lukas staff 225805 6 May 20:45 1778089512980_m1.jpg\n-rw-r--r-- 1 lukas staff 163460 6 May 20:45 1778089544169_m2.jpg\n-rw-r--r-- 1 lukas staff 225873 6 May 20:45 1778089545645_m1.jpg\n-rw-r--r-- 1 lukas staff 163449 6 May 20:46 1778089575492_m2.jpg\n-rw-r--r-- 1 lukas staff 225774 6 May 20:46 1778089577668_m1.jpg\n-rw-r--r-- 1 lukas staff 163494 6 May 20:46 1778089607106_m2.jpg\n-rw-r--r-- 1 lukas staff 225676 6 May 20:46 1778089609200_m1.jpg\n-rw-r--r-- 1 lukas staff 163495 6 May 20:47 1778089638425_m2.jpg\n-rw-r--r-- 1 lukas staff 225684 6 May 20:47 1778089640871_m1.jpg\n-rw-r--r-- 1 lukas staff 163531 6 May 20:47 1778089670092_m2.jpg\n-rw-r--r-- 1 lukas staff 225749 6 May 20:47 1778089672038_m1.jpg\n-rw-r--r-- 1 lukas staff 163493 6 May 20:48 1778089701229_m2.jpg\n-rw-r--r-- 1 lukas staff 225755 6 May 20:48 1778089703354_m1.jpg\n-rw-r--r-- 1 lukas staff 163523 6 May 20:48 1778089732771_m2.jpg\n-rw-r--r-- 1 lukas staff 225931 6 May 20:48 1778089734971_m1.jpg\n-rw-r--r-- 1 lukas staff 163494 6 May 20:49 1778089764207_m2.jpg\n-rw-r--r-- 1 lukas staff 225933 6 May 20:49 1778089766206_m1.jpg\n-rw-r--r-- 1 lukas staff 163491 6 May 20:49 1778089795431_m2.jpg\n-rw-r--r-- 1 lukas staff 225758 6 May 20:49 1778089797542_m1.jpg\n-rw-r--r-- 1 lukas staff 163441 6 May 20:50 1778089827655_m2.jpg\n-rw-r--r-- 1 lukas staff 225584 6 May 20:50 1778089828722_m1.jpg\n-rw-r--r-- 1 lukas staff 163535 6 May 20:51 1778089859907_m2.jpg\n-rw-r--r-- 1 lukas staff 225903 6 May 20:51 1778089861390_m1.jpg\n-rw-r--r-- 1 lukas staff 163493 6 May 20:51 1778089891253_m2.jpg\n-rw-r--r-- 1 lukas staff 225659 6 May 20:51 1778089893127_m1.jpg\n-rw-r--r-- 1 lukas staff 163445 6 May 20:52 1778089922831_m2.jpg\n-rw-r--r-- 1 lukas staff 225719 6 May 20:52 1778089925227_m1.jpg\n-rw-r--r-- 1 lukas staff 163452 6 May 20:52 1778089954782_m2.jpg\n-rw-r--r-- 1 lukas staff 225714 6 May 20:52 1778089956766_m1.jpg\n-rw-r--r-- 1 lukas staff 163417 6 May 20:53 1778089985966_m2.jpg\n-rw-r--r-- 1 lukas staff 225741 6 May 20:53 1778089988057_m1.jpg\n-rw-r--r-- 1 lukas staff 163393 6 May 20:53 1778090017780_m2.jpg\n-rw-r--r-- 1 lukas staff 225912 6 May 20:53 1778090019726_m1.jpg\n-rw-r--r-- 1 lukas staff 163432 6 May 20:54 1778090049955_m2.jpg\n-rw-r--r-- 1 lukas staff 225914 6 May 20:54 1778090052527_m1.jpg\n-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 1600165 6 May 20:45 compact_monitor_1_1778089522686.mp4\n-rw-r--r-- 1 lukas staff 352054 6 May 20:50 compact_monitor_1_1778089827658.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\n-rw-r--r-- 1 lukas staff 1262068 6 May 20:45 compact_monitor_2_1778089524717.mp4\n-rw-r--r-- 1 lukas staff 224813 6 May 20:50 compact_monitor_2_1778089828654.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.3487367,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35073137,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42719415,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42918882,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.58410907,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58610374,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6625665,"top":1.0,"width":0.078457445,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66456115,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-6274320822961500835
|
2327401727746029571
|
click
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 33504
drwxr-xr-x 91 lukas staff 2912 6 May 20:43 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg
-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg
-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg
-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg
-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg
-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg
-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg
-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg
-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg
-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg
-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg
-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg
-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg
-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg
-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg
-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg
-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg
-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg
-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg
-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg
-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg
-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg
-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg
-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 38952
drwxr-xr-x 81 lukas staff 2592 6 May 20:54 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg
-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg
-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg
-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg
-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg
-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg
-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg
-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg
-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg
-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg
-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg
-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg
-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg
-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg
-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg
-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg
-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg
-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg
-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg
-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg
-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg
-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg
-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg
-rw-r--r-- 1 lukas staff 163475 6 May 20:44 1778089447402_m2.jpg
-rw-r--r-- 1 lukas staff 225612 6 May 20:44 1778089448689_m1.jpg
-rw-r--r-- 1 lukas staff 163490 6 May 20:44 1778089480303_m2.jpg
-rw-r--r-- 1 lukas staff 225716 6 May 20:44 1778089481503_m1.jpg
-rw-r--r-- 1 lukas staff 163451 6 May 20:45 1778089511984_m2.jpg
-rw-r--r-- 1 lukas staff 225805 6 May 20:45 1778089512980_m1.jpg
-rw-r--r-- 1 lukas staff 163460 6 May 20:45 1778089544169_m2.jpg
-rw-r--r-- 1 lukas staff 225873 6 May 20:45 1778089545645_m1.jpg
-rw-r--r-- 1 lukas staff 163449 6 May 20:46 1778089575492_m2.jpg
-rw-r--r-- 1 lukas staff 225774 6 May 20:46 1778089577668_m1.jpg
-rw-r--r-- 1 lukas staff 163494 6 May 20:46 1778089607106_m2.jpg
-rw-r--r-- 1 lukas staff 225676 6 May 20:46 1778089609200_m1.jpg
-rw-r--r-- 1 lukas staff 163495 6 May 20:47 1778089638425_m2.jpg
-rw-r--r-- 1 lukas staff 225684 6 May 20:47 1778089640871_m1.jpg
-rw-r--r-- 1 lukas staff 163531 6 May 20:47 1778089670092_m2.jpg
-rw-r--r-- 1 lukas staff 225749 6 May 20:47 1778089672038_m1.jpg
-rw-r--r-- 1 lukas staff 163493 6 May 20:48 1778089701229_m2.jpg
-rw-r--r-- 1 lukas staff 225755 6 May 20:48 1778089703354_m1.jpg
-rw-r--r-- 1 lukas staff 163523 6 May 20:48 1778089732771_m2.jpg
-rw-r--r-- 1 lukas staff 225931 6 May 20:48 1778089734971_m1.jpg
-rw-r--r-- 1 lukas staff 163494 6 May 20:49 1778089764207_m2.jpg
-rw-r--r-- 1 lukas staff 225933 6 May 20:49 1778089766206_m1.jpg
-rw-r--r-- 1 lukas staff 163491 6 May 20:49 1778089795431_m2.jpg
-rw-r--r-- 1 lukas staff 225758 6 May 20:49 1778089797542_m1.jpg
-rw-r--r-- 1 lukas staff 163441 6 May 20:50 1778089827655_m2.jpg
-rw-r--r-- 1 lukas staff 225584 6 May 20:50 1778089828722_m1.jpg
-rw-r--r-- 1 lukas staff 163535 6 May 20:51 1778089859907_m2.jpg
-rw-r--r-- 1 lukas staff 225903 6 May 20:51 1778089861390_m1.jpg
-rw-r--r-- 1 lukas staff 163493 6 May 20:51 1778089891253_m2.jpg
-rw-r--r-- 1 lukas staff 225659 6 May 20:51 1778089893127_m1.jpg
-rw-r--r-- 1 lukas staff 163445 6 May 20:52 1778089922831_m2.jpg
-rw-r--r-- 1 lukas staff 225719 6 May 20:52 1778089925227_m1.jpg
-rw-r--r-- 1 lukas staff 163452 6 May 20:52 1778089954782_m2.jpg
-rw-r--r-- 1 lukas staff 225714 6 May 20:52 1778089956766_m1.jpg
-rw-r--r-- 1 lukas staff 163417 6 May 20:53 1778089985966_m2.jpg
-rw-r--r-- 1 lukas staff 225741 6 May 20:53 1778089988057_m1.jpg
-rw-r--r-- 1 lukas staff 163393 6 May 20:53 1778090017780_m2.jpg
-rw-r--r-- 1 lukas staff 225912 6 May 20:53 1778090019726_m1.jpg
-rw-r--r-- 1 lukas staff 163432 6 May 20:54 1778090049955_m2.jpg
-rw-r--r-- 1 lukas staff 225914 6 May 20:54 1778090052527_m1.jpg
-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 1600165 6 May 20:45 compact_monitor_1_1778089522686.mp4
-rw-r--r-- 1 lukas staff 352054 6 May 20:50 compact_monitor_1_1778089827658.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
-rw-r--r-- 1 lukas staff 1262068 6 May 20:45 compact_monitor_2_1778089524717.mp4
-rw-r--r-- 1 lukas staff 224813 6 May 20:50 compact_monitor_2_1778089828654.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
151
|
NULL
|
NULL
|
NULL
|
|
153
|
NULL
|
0
|
2026-05-06T18:02:03.561963+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-06/1778 /Users/lukas/.screenpipe/data/data/2026-05-06/1778090523561_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 33504
drwxr-xr-x 91 lukas staff 2912 6 May 20:43 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg
-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg
-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg
-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg
-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg
-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg
-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg
-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg
-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg
-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg
-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg
-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg
-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg
-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg
-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg
-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg
-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg
-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg
-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg
-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg
-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg
-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg
-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg
-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 38952
drwxr-xr-x 81 lukas staff 2592 6 May 20:54 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg
-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg
-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg
-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg
-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg
-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg
-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg
-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg
-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg
-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg
-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg
-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg
-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg
-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg
-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg
-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg
-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg
-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg
-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg
-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg
-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg
-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg
-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg
-rw-r--r-- 1 lukas staff 163475 6 May 20:44 1778089447402_m2.jpg
-rw-r--r-- 1 lukas staff 225612 6 May 20:44 1778089448689_m1.jpg
-rw-r--r-- 1 lukas staff 163490 6 May 20:44 1778089480303_m2.jpg
-rw-r--r-- 1 lukas staff 225716 6 May 20:44 1778089481503_m1.jpg
-rw-r--r-- 1 lukas staff 163451 6 May 20:45 1778089511984_m2.jpg
-rw-r--r-- 1 lukas staff 225805 6 May 20:45 1778089512980_m1.jpg
-rw-r--r-- 1 lukas staff 163460 6 May 20:45 1778089544169_m2.jpg
-rw-r--r-- 1 lukas staff 225873 6 May 20:45 1778089545645_m1.jpg
-rw-r--r-- 1 lukas staff 163449 6 May 20:46 1778089575492_m2.jpg
-rw-r--r-- 1 lukas staff 225774 6 May 20:46 1778089577668_m1.jpg
-rw-r--r-- 1 lukas staff 163494 6 May 20:46 1778089607106_m2.jpg
-rw-r--r-- 1 lukas staff 225676 6 May 20:46 1778089609200_m1.jpg
-rw-r--r-- 1 lukas staff 163495 6 May 20:47 1778089638425_m2.jpg
-rw-r--r-- 1 lukas staff 225684 6 May 20:47 1778089640871_m1.jpg
-rw-r--r-- 1 lukas staff 163531 6 May 20:47 1778089670092_m2.jpg
-rw-r--r-- 1 lukas staff 225749 6 May 20:47 1778089672038_m1.jpg
-rw-r--r-- 1 lukas staff 163493 6 May 20:48 1778089701229_m2.jpg
-rw-r--r-- 1 lukas staff 225755 6 May 20:48 1778089703354_m1.jpg
-rw-r--r-- 1 lukas staff 163523 6 May 20:48 1778089732771_m2.jpg
-rw-r--r-- 1 lukas staff 225931 6 May 20:48 1778089734971_m1.jpg
-rw-r--r-- 1 lukas staff 163494 6 May 20:49 1778089764207_m2.jpg
-rw-r--r-- 1 lukas staff 225933 6 May 20:49 1778089766206_m1.jpg
-rw-r--r-- 1 lukas staff 163491 6 May 20:49 1778089795431_m2.jpg
-rw-r--r-- 1 lukas staff 225758 6 May 20:49 1778089797542_m1.jpg
-rw-r--r-- 1 lukas staff 163441 6 May 20:50 1778089827655_m2.jpg
-rw-r--r-- 1 lukas staff 225584 6 May 20:50 1778089828722_m1.jpg
-rw-r--r-- 1 lukas staff 163535 6 May 20:51 1778089859907_m2.jpg
-rw-r--r-- 1 lukas staff 225903 6 May 20:51 1778089861390_m1.jpg
-rw-r--r-- 1 lukas staff 163493 6 May 20:51 1778089891253_m2.jpg
-rw-r--r-- 1 lukas staff 225659 6 May 20:51 1778089893127_m1.jpg
-rw-r--r-- 1 lukas staff 163445 6 May 20:52 1778089922831_m2.jpg
-rw-r--r-- 1 lukas staff 225719 6 May 20:52 1778089925227_m1.jpg
-rw-r--r-- 1 lukas staff 163452 6 May 20:52 1778089954782_m2.jpg
-rw-r--r-- 1 lukas staff 225714 6 May 20:52 1778089956766_m1.jpg
-rw-r--r-- 1 lukas staff 163417 6 May 20:53 1778089985966_m2.jpg
-rw-r--r-- 1 lukas staff 225741 6 May 20:53 1778089988057_m1.jpg
-rw-r--r-- 1 lukas staff 163393 6 May 20:53 1778090017780_m2.jpg
-rw-r--r-- 1 lukas staff 225912 6 May 20:53 1778090019726_m1.jpg
-rw-r--r-- 1 lukas staff 163432 6 May 20:54 1778090049955_m2.jpg
-rw-r--r-- 1 lukas staff 225914 6 May 20:54 1778090052527_m1.jpg
-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 1600165 6 May 20:45 compact_monitor_1_1778089522686.mp4
-rw-r--r-- 1 lukas staff 352054 6 May 20:50 compact_monitor_1_1778089827658.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
-rw-r--r-- 1 lukas staff 1262068 6 May 20:45 compact_monitor_2_1778089524717.mp4
-rw-r--r-- 1 lukas staff 224813 6 May 20:50 compact_monitor_2_1778089828654.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll \ntotal 33504\ndrwxr-xr-x 91 lukas staff 2912 6 May 20:43 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg\n-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg\n-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg\n-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg\n-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg\n-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg\n-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg\n-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg\n-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg\n-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg\n-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg\n-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg\n-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg\n-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg\n-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg\n-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg\n-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg\n-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg\n-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg\n-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg\n-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg\n-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg\n-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg\n-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 38952\ndrwxr-xr-x 81 lukas staff 2592 6 May 20:54 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg\n-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg\n-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg\n-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg\n-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg\n-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg\n-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg\n-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg\n-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg\n-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg\n-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg\n-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg\n-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg\n-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg\n-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg\n-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg\n-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg\n-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg\n-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg\n-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg\n-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg\n-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg\n-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg\n-rw-r--r-- 1 lukas staff 163475 6 May 20:44 1778089447402_m2.jpg\n-rw-r--r-- 1 lukas staff 225612 6 May 20:44 1778089448689_m1.jpg\n-rw-r--r-- 1 lukas staff 163490 6 May 20:44 1778089480303_m2.jpg\n-rw-r--r-- 1 lukas staff 225716 6 May 20:44 1778089481503_m1.jpg\n-rw-r--r-- 1 lukas staff 163451 6 May 20:45 1778089511984_m2.jpg\n-rw-r--r-- 1 lukas staff 225805 6 May 20:45 1778089512980_m1.jpg\n-rw-r--r-- 1 lukas staff 163460 6 May 20:45 1778089544169_m2.jpg\n-rw-r--r-- 1 lukas staff 225873 6 May 20:45 1778089545645_m1.jpg\n-rw-r--r-- 1 lukas staff 163449 6 May 20:46 1778089575492_m2.jpg\n-rw-r--r-- 1 lukas staff 225774 6 May 20:46 1778089577668_m1.jpg\n-rw-r--r-- 1 lukas staff 163494 6 May 20:46 1778089607106_m2.jpg\n-rw-r--r-- 1 lukas staff 225676 6 May 20:46 1778089609200_m1.jpg\n-rw-r--r-- 1 lukas staff 163495 6 May 20:47 1778089638425_m2.jpg\n-rw-r--r-- 1 lukas staff 225684 6 May 20:47 1778089640871_m1.jpg\n-rw-r--r-- 1 lukas staff 163531 6 May 20:47 1778089670092_m2.jpg\n-rw-r--r-- 1 lukas staff 225749 6 May 20:47 1778089672038_m1.jpg\n-rw-r--r-- 1 lukas staff 163493 6 May 20:48 1778089701229_m2.jpg\n-rw-r--r-- 1 lukas staff 225755 6 May 20:48 1778089703354_m1.jpg\n-rw-r--r-- 1 lukas staff 163523 6 May 20:48 1778089732771_m2.jpg\n-rw-r--r-- 1 lukas staff 225931 6 May 20:48 1778089734971_m1.jpg\n-rw-r--r-- 1 lukas staff 163494 6 May 20:49 1778089764207_m2.jpg\n-rw-r--r-- 1 lukas staff 225933 6 May 20:49 1778089766206_m1.jpg\n-rw-r--r-- 1 lukas staff 163491 6 May 20:49 1778089795431_m2.jpg\n-rw-r--r-- 1 lukas staff 225758 6 May 20:49 1778089797542_m1.jpg\n-rw-r--r-- 1 lukas staff 163441 6 May 20:50 1778089827655_m2.jpg\n-rw-r--r-- 1 lukas staff 225584 6 May 20:50 1778089828722_m1.jpg\n-rw-r--r-- 1 lukas staff 163535 6 May 20:51 1778089859907_m2.jpg\n-rw-r--r-- 1 lukas staff 225903 6 May 20:51 1778089861390_m1.jpg\n-rw-r--r-- 1 lukas staff 163493 6 May 20:51 1778089891253_m2.jpg\n-rw-r--r-- 1 lukas staff 225659 6 May 20:51 1778089893127_m1.jpg\n-rw-r--r-- 1 lukas staff 163445 6 May 20:52 1778089922831_m2.jpg\n-rw-r--r-- 1 lukas staff 225719 6 May 20:52 1778089925227_m1.jpg\n-rw-r--r-- 1 lukas staff 163452 6 May 20:52 1778089954782_m2.jpg\n-rw-r--r-- 1 lukas staff 225714 6 May 20:52 1778089956766_m1.jpg\n-rw-r--r-- 1 lukas staff 163417 6 May 20:53 1778089985966_m2.jpg\n-rw-r--r-- 1 lukas staff 225741 6 May 20:53 1778089988057_m1.jpg\n-rw-r--r-- 1 lukas staff 163393 6 May 20:53 1778090017780_m2.jpg\n-rw-r--r-- 1 lukas staff 225912 6 May 20:53 1778090019726_m1.jpg\n-rw-r--r-- 1 lukas staff 163432 6 May 20:54 1778090049955_m2.jpg\n-rw-r--r-- 1 lukas staff 225914 6 May 20:54 1778090052527_m1.jpg\n-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 1600165 6 May 20:45 compact_monitor_1_1778089522686.mp4\n-rw-r--r-- 1 lukas staff 352054 6 May 20:50 compact_monitor_1_1778089827658.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\n-rw-r--r-- 1 lukas staff 1262068 6 May 20:45 compact_monitor_2_1778089524717.mp4\n-rw-r--r-- 1 lukas staff 224813 6 May 20:50 compact_monitor_2_1778089828654.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","depth":4,"on_screen":true,"value":"Last login: Mon Apr 27 19:05:19 on ttys022\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n 17G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n6.7G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n 11G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 32K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 0B\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n352K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n668K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log\n280K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log\n176K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log\n272K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log\n 68K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log\n 76K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log\n596K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log\n388K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 22520352\ndrwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .\ndrwx------+ 93 lukas staff 2976 6 May 19:02 ..\n-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store\ndrwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude\n-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json\ndrwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data\n-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite\n-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm\n-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal\ndrwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes\n-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log\n-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log\n-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log\n-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log\n-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log\n-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log\n-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log\n-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log\n-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log\n-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log\n-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log\n-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log\n-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log\n-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log\n-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log\n-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log\n-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log\n-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log\n-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh\n-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh \n#!/bin/bash\n# screenpipe_sync.sh\n# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).\n# Also copies the day's video/frame data folder to the NAS.\n#\n# Usage:\n# ./screenpipe_sync.sh # syncs yesterday (default)\n# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date\n# ./screenpipe_sync.sh today # syncs today so far\n#\n# Cron example (runs at 3am daily):\n# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1\n\nset -euo pipefail\n\n# ─── CONFIG ───────────────────────────────────────────────────────────────────\nDB_SRC=\"${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}\"\nNAS_MOUNT=\"${NAS_MOUNT:-/Volumes/screenpipe}\"\nNAS_DB=\"$NAS_MOUNT/archive.db\"\nNAS_DATA=\"$NAS_MOUNT/data\"\nLOG_FILE=\"$HOME/.screenpipe/sync.log\"\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── HELPERS ──────────────────────────────────────────────────────────────────\nSCRIPT_START=$(date +%s)\n\nlog() {\n local msg=\"[$(date '+%Y-%m-%d %H:%M:%S')] $*\"\n echo \"$msg\" | tee -a \"$LOG_FILE\"\n}\n\nstep() {\n local now=$(date +%s)\n local elapsed=$(( now - SCRIPT_START ))\n local min=$(( elapsed / 60 ))\n local sec=$(( elapsed % 60 ))\n printf \"\\n[+%02dm%02ds] ▶ %s\\n\" \"$min\" \"$sec\" \"$*\" | tee -a \"$LOG_FILE\"\n}\n\nrun_sqlite_heredoc() {\n local label=\"$1\"\n local sql=\"$2\"\n local start=$(date +%s)\n\n printf \" %-36s \" \"$label\"\n\n sqlite3 \"$DB_SRC\" <<< \"$sql\" &\n local pid=$!\n local spin=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')\n local i=0\n while kill -0 \"$pid\" 2>/dev/null; do\n printf \"\\r %-36s %s \" \"$label\" \"${spin[$i]}\"\n i=$(( (i + 1) % 10 ))\n sleep 0.2\n done\n wait \"$pid\"\n local rc=$?\n if [ $rc -ne 0 ]; then\n printf \"\\r %-36s ✗ FAILED\\n\" \"$label\" | tee -a \"$LOG_FILE\"\n exit $rc\n fi\n\n local dur=$(( $(date +%s) - start ))\n printf \"\\r %-36s ✓ %dm%02ds\\n\" \"$label\" \"$(( dur / 60 ))\" \"$(( dur % 60 ))\" | tee -a \"$LOG_FILE\"\n}\n\ncheck() {\n local label=\"$1\" got=\"$2\" expected=\"$3\"\n if [ \"$got\" -eq \"$expected\" ]; then\n printf \" %-20s %s / %s ✓\\n\" \"$label:\" \"$got\" \"$expected\"\n else\n printf \" %-20s %s / %s ✗ MISMATCH\\n\" \"$label:\" \"$got\" \"$expected\"\n fi\n}\n# ──────────────────────────────────────────────────────────────────────────────\n\n# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────\nif [ \"${1:-}\" = \"today\" ]; then\n TARGET_DATE=$(date +%Y-%m-%d)\nelif [ -n \"${1:-}\" ]; then\n TARGET_DATE=\"$1\"\n if ! [[ \"$TARGET_DATE\" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then\n echo \"ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday.\"\n exit 1\n fi\nelse\n TARGET_DATE=$(date -v-1d +%Y-%m-%d)\nfi\n\nlog \"========================================\"\nlog \"Screenpipe sync starting for: $TARGET_DATE\"\nlog \"========================================\"\n\n# ─── PREFLIGHT ────────────────────────────────────────────────────────────────\nstep \"Preflight checks\"\n\nif [ ! -f \"$DB_SRC\" ]; then\n log \"ERROR: Source DB not found at $DB_SRC\"; exit 1\nfi\nprintf \" %-20s %s (%s)\\n\" \"Source DB:\" \"OK\" \"$(du -sh \"$DB_SRC\" | cut -f1)\"\n\nif [ ! -d \"$NAS_MOUNT\" ]; then\n log \"ERROR: NAS not mounted at $NAS_MOUNT\"; exit 1\nfi\nprintf \" %-20s %s\\n\" \"NAS mount:\" \"OK $NAS_MOUNT\"\n\n# Check if DB already synced for this date\nDB_ALREADY_SYNCED=false\nif [ -f \"$NAS_DB\" ]; then\n EXISTING=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\" 2>/dev/null || echo \"0\")\n if [ \"$EXISTING\" -gt \"0\" ]; then\n log \"Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n else\n printf \" %-20s %s (%s)\\n\" \"Archive DB:\" \"exists\" \"$(du -sh \"$NAS_DB\" | cut -f1)\"\n fi\nelse\n printf \" %-20s %s\\n\" \"Archive DB:\" \"will be created\"\nfi\n\n# Source data dir for this date\nDATA_SRC=\"$HOME/.screenpipe/data/data/$TARGET_DATE\"\nif [ -d \"$DATA_SRC\" ]; then\n DATA_SIZE=$(du -sh \"$DATA_SRC\" | cut -f1)\n DATA_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n printf \" %-20s %s (%s files, %s)\\n\" \"Data dir:\" \"OK\" \"$DATA_FILES\" \"$DATA_SIZE\"\nelse\n printf \" %-20s %s\\n\" \"Data dir:\" \"not found — skipping file copy\"\nfi\n\n# ─── DB SYNC ──────────────────────────────────────────────────────────────────\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────\n step \"Counting source rows for $TARGET_DATE\"\n\n SRC_FRAMES=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_ELEMENTS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_UI=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n SRC_OCR=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n SRC_MEETINGS=$(sqlite3 \"$DB_SRC\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';\")\n\n printf \" %-20s %s\\n\" \"frames:\" \"$SRC_FRAMES\"\n printf \" %-20s %s\\n\" \"elements:\" \"$SRC_ELEMENTS\"\n printf \" %-20s %s\\n\" \"ui_events:\" \"$SRC_UI\"\n printf \" %-20s %s\\n\" \"ocr_text:\" \"$SRC_OCR\"\n printf \" %-20s %s\\n\" \"meetings:\" \"$SRC_MEETINGS\"\n\n if [ \"$SRC_FRAMES\" -eq \"0\" ]; then\n log \"No frames found for $TARGET_DATE — skipping DB sync\"\n DB_ALREADY_SYNCED=true\n fi\n\nfi\n\nif [ \"$DB_ALREADY_SYNCED\" = false ]; then\n\n # ─── INIT TABLES ──────────────────────────────────────────────────────────\n step \"Initialising tables, indexes, FTS\"\n\n run_sqlite_heredoc \"creating tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;\nCREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role, frame_id UNINDEXED,\n content='elements', content_rowid='id', tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url, id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content,\n app_name,\n window_title,\n element_name,\n content='ui_events',\n content_rowid='id',\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── SYNC DATA ────────────────────────────────────────────────────────────\n step \"Syncing data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks\n SELECT * FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames\n SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text\n SELECT o.* FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events\n SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements\n SELECT e.* FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings\n SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE ───────────────────────────────────────────────────────────\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(rowid, text, role)\n SELECT e.id, e.text, e.role\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)\n SELECT id, full_text, app_name, window_name, browser_url, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND full_text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n SELECT id, text_content, app_name, window_title, element_name\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n # ─── VERIFY DB ────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n\nfi\n\n# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────\n# Always runs regardless of DB sync status\nstep \"Copying data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-36s \" \"rsync $TARGET_DATE/ → NAS\"\n rsync -a --ignore-existing \\\n \"$DATA_SRC/\" \\\n \"$NAS_DATA/$TARGET_DATE/\" \\\n 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -eq \"$SRC_FILES\" ]; then\n printf \"\\r %-36s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \\\n \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-36s ✗ %s / %s files\\n\" \\\n \"rsync $TARGET_DATE/ → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-36s %s\\n\" \"rsync $TARGET_DATE/ → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE\"\nlog \"========================================\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 0\ndrwxr-xr-x 2 lukas staff 64 6 May 20:22 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 9424\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 .\ndrwx------+ 94 lukas staff 3008 6 May 20:27 ..\ndrwxr-xr-x 5 lukas staff 160 6 May 20:28 data\n-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop\nscreenpipe stopped\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll\ntotal 21216\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 .\ndrwx------+ 94 lukas staff 3008 6 May 20:29 ..\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 data\n-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes\n-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll\ntotal 3056\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 .\ndrwxr-xr-x 8 lukas staff 256 6 May 20:32 ..\n-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4\n-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4\n-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4\n-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4\n-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 data\ndrwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll\ntotal 0\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 .\ndrwxr-xr-x 18 lukas staff 576 6 May 20:31 ..\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 17432\ndrwxr-xr-x 57 lukas staff 1824 6 May 20:32 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg\n-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg\n-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg\n-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg\n-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg\n-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg\n-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg\n-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg\n-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg\n-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg\n-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg\n-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg\n-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg\n-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg\n-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg\n-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg\n-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg\n-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg\n-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg\n-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg\n-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg\n-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg\n-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg\n-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg\n-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 24992\ndrwxr-xr-x 66 lukas staff 2112 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 25768\ndrwxr-xr-x 68 lukas staff 2176 6 May 20:42 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll \ntotal 33504\ndrwxr-xr-x 91 lukas staff 2912 6 May 20:43 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg\n-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg\n-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg\n-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg\n-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg\n-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg\n-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg\n-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg\n-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg\n-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg\n-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg\n-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg\n-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg\n-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg\n-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg\n-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg\n-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg\n-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg\n-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg\n-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg\n-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg\n-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg\n-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg\n-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg\n-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg\n-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg\n-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg\n-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg\n-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg\n-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg\n-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg\n-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg\n-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg\n-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg\n-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg\n-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg\n-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg\n-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg\n-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg\n-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg\n-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg\n-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg\n-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg\n-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg\n-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg\n-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg\n-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg\n-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg\n-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg\n-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg\n-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg\n-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg\n-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg\n-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg\n-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg\n-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg\n-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg\n-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg\n-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg\n-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg\n-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg\n-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg\n-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg\n-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg\n-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg\n-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg\n-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg\n-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg\n-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg\n-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg\n-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg\n-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll\ntotal 38952\ndrwxr-xr-x 81 lukas staff 2592 6 May 20:54 .\ndrwxr-xr-x 3 lukas staff 96 6 May 20:27 ..\n-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg\n-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg\n-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg\n-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg\n-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg\n-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg\n-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg\n-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg\n-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg\n-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg\n-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg\n-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg\n-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg\n-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg\n-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg\n-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg\n-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg\n-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg\n-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg\n-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg\n-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg\n-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg\n-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg\n-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg\n-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg\n-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg\n-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg\n-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg\n-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg\n-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg\n-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg\n-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg\n-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg\n-rw-r--r-- 1 lukas staff 163475 6 May 20:44 1778089447402_m2.jpg\n-rw-r--r-- 1 lukas staff 225612 6 May 20:44 1778089448689_m1.jpg\n-rw-r--r-- 1 lukas staff 163490 6 May 20:44 1778089480303_m2.jpg\n-rw-r--r-- 1 lukas staff 225716 6 May 20:44 1778089481503_m1.jpg\n-rw-r--r-- 1 lukas staff 163451 6 May 20:45 1778089511984_m2.jpg\n-rw-r--r-- 1 lukas staff 225805 6 May 20:45 1778089512980_m1.jpg\n-rw-r--r-- 1 lukas staff 163460 6 May 20:45 1778089544169_m2.jpg\n-rw-r--r-- 1 lukas staff 225873 6 May 20:45 1778089545645_m1.jpg\n-rw-r--r-- 1 lukas staff 163449 6 May 20:46 1778089575492_m2.jpg\n-rw-r--r-- 1 lukas staff 225774 6 May 20:46 1778089577668_m1.jpg\n-rw-r--r-- 1 lukas staff 163494 6 May 20:46 1778089607106_m2.jpg\n-rw-r--r-- 1 lukas staff 225676 6 May 20:46 1778089609200_m1.jpg\n-rw-r--r-- 1 lukas staff 163495 6 May 20:47 1778089638425_m2.jpg\n-rw-r--r-- 1 lukas staff 225684 6 May 20:47 1778089640871_m1.jpg\n-rw-r--r-- 1 lukas staff 163531 6 May 20:47 1778089670092_m2.jpg\n-rw-r--r-- 1 lukas staff 225749 6 May 20:47 1778089672038_m1.jpg\n-rw-r--r-- 1 lukas staff 163493 6 May 20:48 1778089701229_m2.jpg\n-rw-r--r-- 1 lukas staff 225755 6 May 20:48 1778089703354_m1.jpg\n-rw-r--r-- 1 lukas staff 163523 6 May 20:48 1778089732771_m2.jpg\n-rw-r--r-- 1 lukas staff 225931 6 May 20:48 1778089734971_m1.jpg\n-rw-r--r-- 1 lukas staff 163494 6 May 20:49 1778089764207_m2.jpg\n-rw-r--r-- 1 lukas staff 225933 6 May 20:49 1778089766206_m1.jpg\n-rw-r--r-- 1 lukas staff 163491 6 May 20:49 1778089795431_m2.jpg\n-rw-r--r-- 1 lukas staff 225758 6 May 20:49 1778089797542_m1.jpg\n-rw-r--r-- 1 lukas staff 163441 6 May 20:50 1778089827655_m2.jpg\n-rw-r--r-- 1 lukas staff 225584 6 May 20:50 1778089828722_m1.jpg\n-rw-r--r-- 1 lukas staff 163535 6 May 20:51 1778089859907_m2.jpg\n-rw-r--r-- 1 lukas staff 225903 6 May 20:51 1778089861390_m1.jpg\n-rw-r--r-- 1 lukas staff 163493 6 May 20:51 1778089891253_m2.jpg\n-rw-r--r-- 1 lukas staff 225659 6 May 20:51 1778089893127_m1.jpg\n-rw-r--r-- 1 lukas staff 163445 6 May 20:52 1778089922831_m2.jpg\n-rw-r--r-- 1 lukas staff 225719 6 May 20:52 1778089925227_m1.jpg\n-rw-r--r-- 1 lukas staff 163452 6 May 20:52 1778089954782_m2.jpg\n-rw-r--r-- 1 lukas staff 225714 6 May 20:52 1778089956766_m1.jpg\n-rw-r--r-- 1 lukas staff 163417 6 May 20:53 1778089985966_m2.jpg\n-rw-r--r-- 1 lukas staff 225741 6 May 20:53 1778089988057_m1.jpg\n-rw-r--r-- 1 lukas staff 163393 6 May 20:53 1778090017780_m2.jpg\n-rw-r--r-- 1 lukas staff 225912 6 May 20:53 1778090019726_m1.jpg\n-rw-r--r-- 1 lukas staff 163432 6 May 20:54 1778090049955_m2.jpg\n-rw-r--r-- 1 lukas staff 225914 6 May 20:54 1778090052527_m1.jpg\n-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4\n-rw-r--r-- 1 lukas staff 1600165 6 May 20:45 compact_monitor_1_1778089522686.mp4\n-rw-r--r-- 1 lukas staff 352054 6 May 20:50 compact_monitor_1_1778089827658.mp4\n-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4\n-rw-r--r-- 1 lukas staff 1262068 6 May 20:45 compact_monitor_2_1778089524717.mp4\n-rw-r--r-- 1 lukas staff 224813 6 May 20:50 compact_monitor_2_1778089828654.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16388889,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16805555,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32777777,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33194444,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.65555555,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6597222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.8194444,"top":0.05888889,"width":0.16388889,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82361114,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-6274320822961500835
|
2327401727746029571
|
visual_change
|
accessibility
|
NULL
|
Last login: Mon Apr 27 19:05:19 on ttys022
Poetry Last login: Mon Apr 27 19:05:19 on ttys022
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
17G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
6.7G /Users/lukas/.screenpipe/data
11G /Users/lukas/.screenpipe/db.sqlite
32K /Users/lukas/.screenpipe/db.sqlite-shm
0B /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
352K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
668K /Users/lukas/.screenpipe/screenpipe.2026-04-21.0.log
280K /Users/lukas/.screenpipe/screenpipe.2026-04-22.0.log
176K /Users/lukas/.screenpipe/screenpipe.2026-04-23.0.log
272K /Users/lukas/.screenpipe/screenpipe.2026-04-24.0.log
68K /Users/lukas/.screenpipe/screenpipe.2026-04-25.0.log
76K /Users/lukas/.screenpipe/screenpipe.2026-04-26.0.log
596K /Users/lukas/.screenpipe/screenpipe.2026-04-27.0.log
388K /Users/lukas/.screenpipe/screenpipe.2026-04-28.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
36K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 22520352
drwxr-xr-x 30 lukas staff 960 28 Apr 09:18 .
drwx------+ 93 lukas staff 2976 6 May 19:02 ..
-rw-r--r--@ 1 lukas staff 8196 26 Apr 17:14 .DS_Store
drwxr-xr-x 3 lukas staff 96 26 Apr 19:23 .claude
-rw-r--r-- 1 lukas staff 358 16 Apr 16:49 config.json
drwxr-xr-x 167 lukas staff 5344 18 Apr 14:45 data
-rw-r--r--@ 1 lukas staff 11526176768 6 May 18:58 db.sqlite
-rw-r--r--@ 1 lukas staff 32768 6 May 18:58 db.sqlite-shm
-rw-r--r--@ 1 lukas staff 0 6 May 18:58 db.sqlite-wal
drwxr-xr-x 9 lukas staff 288 15 Apr 14:53 pipes
-rw-r--r-- 1 lukas staff 132736 9 Apr 21:27 screenpipe.2026-04-09.0.log
-rw-r--r-- 1 lukas staff 95425 11 Apr 23:14 screenpipe.2026-04-11.0.log
-rw-r--r-- 1 lukas staff 72332 12 Apr 23:55 screenpipe.2026-04-12.0.log
-rw-r--r-- 1 lukas staff 71555 13 Apr 19:50 screenpipe.2026-04-13.0.log
-rw-r--r-- 1 lukas staff 162389 14 Apr 19:31 screenpipe.2026-04-14.0.log
-rw-r--r-- 1 lukas staff 175763 15 Apr 18:55 screenpipe.2026-04-15.0.log
-rw-r--r-- 1 lukas staff 196994 16 Apr 20:33 screenpipe.2026-04-16.0.log
-rw-r--r-- 1 lukas staff 208424 17 Apr 21:06 screenpipe.2026-04-17.0.log
-rw-r--r-- 1 lukas staff 61983 18 Apr 14:45 screenpipe.2026-04-18.0.log
-rw-r--r-- 1 lukas staff 359800 20 Apr 18:52 screenpipe.2026-04-20.0.log
-rw-r--r-- 1 lukas staff 683671 21 Apr 20:18 screenpipe.2026-04-21.0.log
-rw-r--r-- 1 lukas staff 284763 22 Apr 19:10 screenpipe.2026-04-22.0.log
-rw-r--r-- 1 lukas staff 176386 23 Apr 14:01 screenpipe.2026-04-23.0.log
-rw-r--r-- 1 lukas staff 276189 24 Apr 22:35 screenpipe.2026-04-24.0.log
-rw-r--r-- 1 lukas staff 68794 25 Apr 19:40 screenpipe.2026-04-25.0.log
-rw-r--r-- 1 lukas staff 75543 26 Apr 22:56 screenpipe.2026-04-26.0.log
-rw-r--r-- 1 lukas staff 607811 27 Apr 20:42 screenpipe.2026-04-27.0.log
-rw-r--r-- 1 lukas staff 396094 28 Apr 22:23 screenpipe.2026-04-28.0.log
-rwxr-xr-x@ 1 lukas staff 14994 25 Apr 18:50 screenpipe_sync.sh
-rw-r--r--@ 1 lukas staff 34823 6 May 18:58 sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cat screenpipe_sync.sh
#!/bin/bash
# screenpipe_sync.sh
# Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions).
# Also copies the day's video/frame data folder to the NAS.
#
# Usage:
# ./screenpipe_sync.sh # syncs yesterday (default)
# ./screenpipe_sync.sh 2026-04-15 # syncs a specific date
# ./screenpipe_sync.sh today # syncs today so far
#
# Cron example (runs at 3am daily):
# 0 3 * * * /Users/lukas/.screenpipe/screenpipe_sync.sh >> /Users/lukas/.screenpipe/sync.log 2>&1
set -euo pipefail
# ─── CONFIG ───────────────────────────────────────────────────────────────────
DB_SRC="${SCREENPIPE_DB:-$HOME/.screenpipe/db.sqlite}"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/screenpipe}"
NAS_DB="$NAS_MOUNT/archive.db"
NAS_DATA="$NAS_MOUNT/data"
LOG_FILE="$HOME/.screenpipe/sync.log"
# ──────────────────────────────────────────────────────────────────────────────
# ─── HELPERS ──────────────────────────────────────────────────────────────────
SCRIPT_START=$(date +%s)
log() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
echo "$msg" | tee -a "$LOG_FILE"
}
step() {
local now=$(date +%s)
local elapsed=$(( now - SCRIPT_START ))
local min=$(( elapsed / 60 ))
local sec=$(( elapsed % 60 ))
printf "\n[+%02dm%02ds] ▶ %s\n" "$min" "$sec" "$*" | tee -a "$LOG_FILE"
}
run_sqlite_heredoc() {
local label="$1"
local sql="$2"
local start=$(date +%s)
printf " %-36s " "$label"
sqlite3 "$DB_SRC" <<< "$sql" &
local pid=$!
local spin=[PASSWORD] '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local i=0
while kill -0 "$pid" 2>/dev/null; do
printf "\r %-36s %s " "$label" "${spin[$i]}"
i=$(( (i + 1) % 10 ))
sleep 0.2
done
wait "$pid"
local rc=$?
if [ $rc -ne 0 ]; then
printf "\r %-36s ✗ FAILED\n" "$label" | tee -a "$LOG_FILE"
exit $rc
fi
local dur=$(( $(date +%s) - start ))
printf "\r %-36s ✓ %dm%02ds\n" "$label" "$(( dur / 60 ))" "$(( dur % 60 ))" | tee -a "$LOG_FILE"
}
check() {
local label="$1" got="$2" expected="$3"
if [ "$got" -eq "$expected" ]; then
printf " %-20s %s / %s ✓\n" "$label:" "$got" "$expected"
else
printf " %-20s %s / %s ✗ MISMATCH\n" "$label:" "$got" "$expected"
fi
}
# ──────────────────────────────────────────────────────────────────────────────
# ─── DATE ARGUMENT ────────────────────────────────────────────────────────────
if [ "${1:-}" = "today" ]; then
TARGET_DATE=$(date +%Y-%m-%d)
elif [ -n "${1:-}" ]; then
TARGET_DATE="$1"
if ! [[ "$TARGET_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
echo "ERROR: Invalid date format. Use YYYY-MM-DD, 'today', or no argument for yesterday."
exit 1
fi
else
TARGET_DATE=$(date -v-1d +%Y-%m-%d)
fi
log "========================================"
log "Screenpipe sync starting for: $TARGET_DATE"
log "========================================"
# ─── PREFLIGHT ────────────────────────────────────────────────────────────────
step "Preflight checks"
if [ ! -f "$DB_SRC" ]; then
log "ERROR: Source DB not found at $DB_SRC"; exit 1
fi
printf " %-20s %s (%s)\n" "Source DB:" "OK" "$(du -sh "$DB_SRC" | cut -f1)"
if [ ! -d "$NAS_MOUNT" ]; then
log "ERROR: NAS not mounted at $NAS_MOUNT"; exit 1
fi
printf " %-20s %s\n" "NAS mount:" "OK $NAS_MOUNT"
# Check if DB already synced for this date
DB_ALREADY_SYNCED=false
if [ -f "$NAS_DB" ]; then
EXISTING=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';" 2>/dev/null || echo "0")
if [ "$EXISTING" -gt "0" ]; then
log "Date $TARGET_DATE already has $EXISTING frames in archive — skipping DB sync"
DB_ALREADY_SYNCED=true
else
printf " %-20s %s (%s)\n" "Archive DB:" "exists" "$(du -sh "$NAS_DB" | cut -f1)"
fi
else
printf " %-20s %s\n" "Archive DB:" "will be created"
fi
# Source data dir for this date
DATA_SRC="$HOME/.screenpipe/data/data/$TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
DATA_SIZE=$(du -sh "$DATA_SRC" | cut -f1)
DATA_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
printf " %-20s %s (%s files, %s)\n" "Data dir:" "OK" "$DATA_FILES" "$DATA_SIZE"
else
printf " %-20s %s\n" "Data dir:" "not found — skipping file copy"
fi
# ─── DB SYNC ──────────────────────────────────────────────────────────────────
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── COUNT SOURCE ROWS ────────────────────────────────────────────────────
step "Counting source rows for $TARGET_DATE"
SRC_FRAMES=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
SRC_ELEMENTS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_UI=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
SRC_OCR=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
SRC_MEETINGS=$(sqlite3 "$DB_SRC" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE';")
printf " %-20s %s\n" "frames:" "$SRC_FRAMES"
printf " %-20s %s\n" "elements:" "$SRC_ELEMENTS"
printf " %-20s %s\n" "ui_events:" "$SRC_UI"
printf " %-20s %s\n" "ocr_text:" "$SRC_OCR"
printf " %-20s %s\n" "meetings:" "$SRC_MEETINGS"
if [ "$SRC_FRAMES" -eq "0" ]; then
log "No frames found for $TARGET_DATE — skipping DB sync"
DB_ALREADY_SYNCED=true
fi
fi
if [ "$DB_ALREADY_SYNCED" = false ]; then
# ─── INIT TABLES ──────────────────────────────────────────────────────────
step "Initialising tables, indexes, FTS"
run_sqlite_heredoc "creating tables" "
ATTACH '$NAS_DB' AS nas;
CREATE TABLE IF NOT EXISTS nas.frames AS SELECT * FROM main.frames WHERE 0;
CREATE TABLE IF NOT EXISTS nas.elements AS SELECT * FROM main.elements WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ui_events AS SELECT * FROM main.ui_events WHERE 0;
CREATE TABLE IF NOT EXISTS nas.ocr_text AS SELECT * FROM main.ocr_text WHERE 0;
CREATE TABLE IF NOT EXISTS nas.video_chunks AS SELECT * FROM main.video_chunks WHERE 0;
CREATE TABLE IF NOT EXISTS nas.meetings AS SELECT * FROM main.meetings WHERE 0;
DETACH nas;
"
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
DETACH nas;
"
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role, frame_id UNINDEXED,
content='elements', content_rowid='id', tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url, id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
);
DETACH nas;
"
# ─── SYNC DATA ────────────────────────────────────────────────────────────
step "Syncing data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks
SELECT * FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames
SELECT * FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text
SELECT o.* FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events
SELECT * FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements
SELECT e.* FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings
SELECT * FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE ───────────────────────────────────────────────────────────
step "Updating FTS indexes"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(rowid, text, role)
SELECT e.id, e.text, e.role
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(rowid, full_text, app_name, window_name, browser_url, id)
SELECT id, full_text, app_name, window_name, browser_url, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND full_text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(rowid, text_content, app_name, window_title, element_name)
SELECT id, text_content, app_name, window_title, element_name
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND text_content IS NOT NULL;
DETACH nas;
"
# ─── VERIFY DB ────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start)= '$TARGET_DATE';")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
fi
# ─── COPY DATA FOLDER ─────────────────────────────────────────────────────────
# Always runs regardless of DB sync status
step "Copying data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-36s " "rsync $TARGET_DATE/ → NAS"
rsync -a --ignore-existing \
"$DATA_SRC/" \
"$NAS_DATA/$TARGET_DATE/" \
2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -eq "$SRC_FILES" ]; then
printf "\r %-36s ✓ %dm%02ds (%s files, %s)\n" \
"rsync $TARGET_DATE/ → NAS" \
"$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-36s ✗ %s / %s files\n" \
"rsync $TARGET_DATE/ → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-36s %s\n" "rsync $TARGET_DATE/ → NAS" "skipped (no source dir)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE"
log "========================================"
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 0
drwxr-xr-x 2 lukas staff 64 6 May 20:22 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ cd ~/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 9424
drwxr-xr-x 8 lukas staff 256 6 May 20:27 .
drwx------+ 94 lukas staff 3008 6 May 20:27 ..
drwxr-xr-x 5 lukas staff 160 6 May 20:28 data
-rw-r--r-- 1 lukas staff 581632 6 May 20:27 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:27 db.sqlite-shm
-rw-r--r-- 1 lukas staff 3312512 6 May 20:28 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 9566 6 May 20:28 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sp-stop
screenpipe stopped
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 21216
drwxr-xr-x 8 lukas staff 256 6 May 20:32 .
drwx------+ 94 lukas staff 3008 6 May 20:29 ..
drwxr-xr-x 18 lukas staff 576 6 May 20:31 data
-rw-r--r-- 1 lukas staff 8708096 6 May 20:31 db.sqlite
-rw-r--r-- 1 lukas staff 32768 6 May 20:32 db.sqlite-shm
-rw-r--r-- 1 lukas staff 1697472 6 May 20:32 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 6 May 20:27 pipes
-rw-r--r-- 1 lukas staff 19041 6 May 20:32 screenpipe.2026-05-06.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ ll
total 3056
drwxr-xr-x 18 lukas staff 576 6 May 20:31 .
drwxr-xr-x 8 lukas staff 256 6 May 20:32 ..
-rw-r--r-- 1 lukas staff 210738 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 218037 6 May 20:28 MacBook Pro Microphone (input)_2026-05-06_17-28-19.mp4
-rw-r--r-- 1 lukas staff 216171 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-28-49.mp4
-rw-r--r-- 1 lukas staff 216193 6 May 20:29 MacBook Pro Microphone (input)_2026-05-06_17-29-19.mp4
-rw-r--r-- 1 lukas staff 209772 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 215405 6 May 20:30 MacBook Pro Microphone (input)_2026-05-06_17-30-18.mp4
-rw-r--r-- 1 lukas staff 205064 6 May 20:31 MacBook Pro Microphone (input)_2026-05-06_17-30-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-27-47.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:28 System Audio (output)_2026-05-06_17-28-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-28-50.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:29 System Audio (output)_2026-05-06_17-29-20.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-29-49.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:30 System Audio (output)_2026-05-06_17-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 6 May 20:31 System Audio (output)_2026-05-06_17-30-47.mp4
drwxr-xr-x 3 lukas staff 96 6 May 20:27 data
drwxr-xr-x 2 lukas staff 64 6 May 20:29 pending-transcriptions
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd data
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ ll
total 0
drwxr-xr-x 3 lukas staff 96 6 May 20:27 .
drwxr-xr-x 18 lukas staff 576 6 May 20:31 ..
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data $ cd 2026-05-06
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 17432
drwxr-xr-x 57 lukas staff 1824 6 May 20:32 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 232466 6 May 20:27 1778088456772_m1.jpg
-rw-r--r-- 1 lukas staff 152554 6 May 20:27 1778088457434_m2.jpg
-rw-r--r-- 1 lukas staff 181543 6 May 20:27 1778088466571_m1.jpg
-rw-r--r-- 1 lukas staff 126979 6 May 20:27 1778088478583_m1.jpg
-rw-r--r-- 1 lukas staff 152544 6 May 20:28 1778088491264_m2.jpg
-rw-r--r-- 1 lukas staff 166250 6 May 20:28 1778088503148_m1.jpg
-rw-r--r-- 1 lukas staff 152522 6 May 20:28 1778088503179_m2.jpg
-rw-r--r-- 1 lukas staff 159999 6 May 20:28 1778088534192_m1.jpg
-rw-r--r-- 1 lukas staff 152579 6 May 20:28 1778088534522_m2.jpg
-rw-r--r-- 1 lukas staff 155560 6 May 20:29 1778088564250_m1.jpg
-rw-r--r-- 1 lukas staff 124040 6 May 20:29 1778088564930_m2.jpg
-rw-r--r-- 1 lukas staff 121232 6 May 20:29 1778088570551_m2.jpg
-rw-r--r-- 1 lukas staff 157568 6 May 20:29 1778088570945_m1.jpg
-rw-r--r-- 1 lukas staff 157625 6 May 20:29 1778088581767_m1.jpg
-rw-r--r-- 1 lukas staff 119295 6 May 20:29 1778088581767_m2.jpg
-rw-r--r-- 1 lukas staff 157529 6 May 20:29 1778088584166_m1.jpg
-rw-r--r-- 1 lukas staff 119415 6 May 20:29 1778088585022_m2.jpg
-rw-r--r-- 1 lukas staff 157483 6 May 20:29 1778088586312_m1.jpg
-rw-r--r-- 1 lukas staff 119430 6 May 20:29 1778088586786_m2.jpg
-rw-r--r-- 1 lukas staff 157657 6 May 20:29 1778088588816_m1.jpg
-rw-r--r-- 1 lukas staff 121321 6 May 20:29 1778088589524_m2.jpg
-rw-r--r-- 1 lukas staff 112106 6 May 20:30 1778088603330_m2.jpg
-rw-r--r-- 1 lukas staff 157634 6 May 20:30 1778088604117_m1.jpg
-rw-r--r-- 1 lukas staff 152205 6 May 20:30 1778088608499_m2.jpg
-rw-r--r-- 1 lukas staff 157651 6 May 20:30 1778088609502_m1.jpg
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 24992
drwxr-xr-x 66 lukas staff 2112 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 25768
drwxr-xr-x 68 lukas staff 2176 6 May 20:42 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ open compact_monitor_1_1778089220643.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 33504
drwxr-xr-x 91 lukas staff 2912 6 May 20:43 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 163575 6 May 20:30 1778088623310_m2.jpg
-rw-r--r-- 1 lukas staff 173535 6 May 20:30 1778088630735_m1.jpg
-rw-r--r-- 1 lukas staff 162111 6 May 20:30 1778088633155_m2.jpg
-rw-r--r-- 1 lukas staff 173763 6 May 20:30 1778088633901_m1.jpg
-rw-r--r-- 1 lukas staff 153966 6 May 20:30 1778088637729_m1.jpg
-rw-r--r-- 1 lukas staff 181815 6 May 20:30 1778088640280_m2.jpg
-rw-r--r-- 1 lukas staff 158733 6 May 20:30 1778088641897_m1.jpg
-rw-r--r-- 1 lukas staff 205244 6 May 20:30 1778088645543_m2.jpg
-rw-r--r-- 1 lukas staff 158969 6 May 20:30 1778088647024_m1.jpg
-rw-r--r-- 1 lukas staff 185029 6 May 20:30 1778088649964_m2.jpg
-rw-r--r-- 1 lukas staff 158980 6 May 20:30 1778088651015_m1.jpg
-rw-r--r-- 1 lukas staff 158729 6 May 20:30 1778088656510_m1.jpg
-rw-r--r-- 1 lukas staff 251895 6 May 20:30 1778088657626_m2.jpg
-rw-r--r-- 1 lukas staff 159037 6 May 20:31 1778088660760_m1.jpg
-rw-r--r-- 1 lukas staff 170173 6 May 20:31 1778088661602_m2.jpg
-rw-r--r-- 1 lukas staff 159039 6 May 20:31 1778088664406_m1.jpg
-rw-r--r-- 1 lukas staff 168123 6 May 20:31 1778088664871_m2.jpg
-rw-r--r-- 1 lukas staff 161993 6 May 20:31 1778088668555_m2.jpg
-rw-r--r-- 1 lukas staff 163729 6 May 20:31 1778088671392_m2.jpg
-rw-r--r-- 1 lukas staff 155859 6 May 20:31 1778088683595_m1.jpg
-rw-r--r-- 1 lukas staff 135122 6 May 20:31 1778088685154_m2.jpg
-rw-r--r-- 1 lukas staff 140146 6 May 20:31 1778088695364_m2.jpg
-rw-r--r-- 1 lukas staff 155883 6 May 20:31 1778088696205_m1.jpg
-rw-r--r-- 1 lukas staff 166491 6 May 20:31 1778088699449_m2.jpg
-rw-r--r-- 1 lukas staff 155839 6 May 20:31 1778088699457_m1.jpg
-rw-r--r-- 1 lukas staff 162622 6 May 20:31 1778088702773_m2.jpg
-rw-r--r-- 1 lukas staff 189289 6 May 20:31 1778088703280_m1.jpg
-rw-r--r-- 1 lukas staff 227256 6 May 20:32 1778088745343_m1.jpg
-rw-r--r-- 1 lukas staff 162471 6 May 20:32 1778088745907_m2.jpg
-rw-r--r-- 1 lukas staff 159690 6 May 20:32 1778088767221_m1.jpg
-rw-r--r-- 1 lukas staff 228402 6 May 20:34 1778088862349_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:34 1778088862922_m2.jpg
-rw-r--r-- 1 lukas staff 228391 6 May 20:34 1778088895443_m1.jpg
-rw-r--r-- 1 lukas staff 162695 6 May 20:34 1778088897069_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:35 1778088926328_m1.jpg
-rw-r--r-- 1 lukas staff 162684 6 May 20:35 1778088927793_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:35 1778088957089_m1.jpg
-rw-r--r-- 1 lukas staff 162545 6 May 20:35 1778088958635_m2.jpg
-rw-r--r-- 1 lukas staff 228407 6 May 20:36 1778088987860_m1.jpg
-rw-r--r-- 1 lukas staff 162483 6 May 20:36 1778088989374_m2.jpg
-rw-r--r-- 1 lukas staff 228420 6 May 20:36 1778089018527_m1.jpg
-rw-r--r-- 1 lukas staff 162536 6 May 20:37 1778089020270_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:37 1778089049194_m1.jpg
-rw-r--r-- 1 lukas staff 162683 6 May 20:37 1778089050974_m2.jpg
-rw-r--r-- 1 lukas staff 228412 6 May 20:38 1778089079866_m1.jpg
-rw-r--r-- 1 lukas staff 162494 6 May 20:38 1778089081721_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:38 1778089110848_m1.jpg
-rw-r--r-- 1 lukas staff 162606 6 May 20:38 1778089112768_m2.jpg
-rw-r--r-- 1 lukas staff 228380 6 May 20:39 1778089141520_m1.jpg
-rw-r--r-- 1 lukas staff 162611 6 May 20:39 1778089143498_m2.jpg
-rw-r--r-- 1 lukas staff 228353 6 May 20:39 1778089172629_m1.jpg
-rw-r--r-- 1 lukas staff 162480 6 May 20:39 1778089174323_m2.jpg
-rw-r--r-- 1 lukas staff 228332 6 May 20:40 1778089203288_m1.jpg
-rw-r--r-- 1 lukas staff 162502 6 May 20:40 1778089205370_m2.jpg
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg
-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg
-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg
-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg
-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg
-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg
-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg
-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg
-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg
-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg
-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg
-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg
-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg
-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg
-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg
-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg
-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg
-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg
-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg
-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg
-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg
-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg
-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg
-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $ ll
total 38952
drwxr-xr-x 81 lukas staff 2592 6 May 20:54 .
drwxr-xr-x 3 lukas staff 96 6 May 20:27 ..
-rw-r--r-- 1 lukas staff 228372 6 May 20:40 1778089234520_m1.jpg
-rw-r--r-- 1 lukas staff 162571 6 May 20:40 1778089236266_m2.jpg
-rw-r--r-- 1 lukas staff 228416 6 May 20:41 1778089265485_m1.jpg
-rw-r--r-- 1 lukas staff 162636 6 May 20:41 1778089267383_m2.jpg
-rw-r--r-- 1 lukas staff 228362 6 May 20:41 1778089296562_m1.jpg
-rw-r--r-- 1 lukas staff 162564 6 May 20:41 1778089298295_m2.jpg
-rw-r--r-- 1 lukas staff 228392 6 May 20:42 1778089327270_m1.jpg
-rw-r--r-- 1 lukas staff 162605 6 May 20:42 1778089329081_m2.jpg
-rw-r--r-- 1 lukas staff 230328 6 May 20:42 1778089358286_m1.jpg
-rw-r--r-- 1 lukas staff 162589 6 May 20:42 1778089360293_m2.jpg
-rw-r--r-- 1 lukas staff 230403 6 May 20:43 1778089389059_m1.jpg
-rw-r--r-- 1 lukas staff 162586 6 May 20:43 1778089391156_m2.jpg
-rw-r--r-- 1 lukas staff 152180 6 May 20:43 1778089403611_m1.jpg
-rw-r--r-- 1 lukas staff 162598 6 May 20:43 1778089407180_m2.jpg
-rw-r--r-- 1 lukas staff 192498 6 May 20:43 1778089409020_m1.jpg
-rw-r--r-- 1 lukas staff 162613 6 May 20:43 1778089409145_m2.jpg
-rw-r--r-- 1 lukas staff 192609 6 May 20:43 1778089411219_m1.jpg
-rw-r--r-- 1 lukas staff 162640 6 May 20:43 1778089411737_m2.jpg
-rw-r--r-- 1 lukas staff 192865 6 May 20:43 1778089413548_m1.jpg
-rw-r--r-- 1 lukas staff 162456 6 May 20:43 1778089418651_m2.jpg
-rw-r--r-- 1 lukas staff 124076 6 May 20:43 1778089418732_m1.jpg
-rw-r--r-- 1 lukas staff 162457 6 May 20:43 1778089420120_m2.jpg
-rw-r--r-- 1 lukas staff 152155 6 May 20:43 1778089420387_m1.jpg
-rw-r--r-- 1 lukas staff 123801 6 May 20:43 1778089423706_m1.jpg
-rw-r--r-- 1 lukas staff 162555 6 May 20:43 1778089423816_m2.jpg
-rw-r--r-- 1 lukas staff 162625 6 May 20:43 1778089426931_m2.jpg
-rw-r--r-- 1 lukas staff 147798 6 May 20:43 1778089427043_m1.jpg
-rw-r--r-- 1 lukas staff 147982 6 May 20:43 1778089429507_m1.jpg
-rw-r--r-- 1 lukas staff 162644 6 May 20:43 1778089429903_m2.jpg
-rw-r--r-- 1 lukas staff 232541 6 May 20:43 1778089431842_m1.jpg
-rw-r--r-- 1 lukas staff 162527 6 May 20:43 1778089432077_m2.jpg
-rw-r--r-- 1 lukas staff 236875 6 May 20:43 1778089433657_m1.jpg
-rw-r--r-- 1 lukas staff 162512 6 May 20:43 1778089434122_m2.jpg
-rw-r--r-- 1 lukas staff 163475 6 May 20:44 1778089447402_m2.jpg
-rw-r--r-- 1 lukas staff 225612 6 May 20:44 1778089448689_m1.jpg
-rw-r--r-- 1 lukas staff 163490 6 May 20:44 1778089480303_m2.jpg
-rw-r--r-- 1 lukas staff 225716 6 May 20:44 1778089481503_m1.jpg
-rw-r--r-- 1 lukas staff 163451 6 May 20:45 1778089511984_m2.jpg
-rw-r--r-- 1 lukas staff 225805 6 May 20:45 1778089512980_m1.jpg
-rw-r--r-- 1 lukas staff 163460 6 May 20:45 1778089544169_m2.jpg
-rw-r--r-- 1 lukas staff 225873 6 May 20:45 1778089545645_m1.jpg
-rw-r--r-- 1 lukas staff 163449 6 May 20:46 1778089575492_m2.jpg
-rw-r--r-- 1 lukas staff 225774 6 May 20:46 1778089577668_m1.jpg
-rw-r--r-- 1 lukas staff 163494 6 May 20:46 1778089607106_m2.jpg
-rw-r--r-- 1 lukas staff 225676 6 May 20:46 1778089609200_m1.jpg
-rw-r--r-- 1 lukas staff 163495 6 May 20:47 1778089638425_m2.jpg
-rw-r--r-- 1 lukas staff 225684 6 May 20:47 1778089640871_m1.jpg
-rw-r--r-- 1 lukas staff 163531 6 May 20:47 1778089670092_m2.jpg
-rw-r--r-- 1 lukas staff 225749 6 May 20:47 1778089672038_m1.jpg
-rw-r--r-- 1 lukas staff 163493 6 May 20:48 1778089701229_m2.jpg
-rw-r--r-- 1 lukas staff 225755 6 May 20:48 1778089703354_m1.jpg
-rw-r--r-- 1 lukas staff 163523 6 May 20:48 1778089732771_m2.jpg
-rw-r--r-- 1 lukas staff 225931 6 May 20:48 1778089734971_m1.jpg
-rw-r--r-- 1 lukas staff 163494 6 May 20:49 1778089764207_m2.jpg
-rw-r--r-- 1 lukas staff 225933 6 May 20:49 1778089766206_m1.jpg
-rw-r--r-- 1 lukas staff 163491 6 May 20:49 1778089795431_m2.jpg
-rw-r--r-- 1 lukas staff 225758 6 May 20:49 1778089797542_m1.jpg
-rw-r--r-- 1 lukas staff 163441 6 May 20:50 1778089827655_m2.jpg
-rw-r--r-- 1 lukas staff 225584 6 May 20:50 1778089828722_m1.jpg
-rw-r--r-- 1 lukas staff 163535 6 May 20:51 1778089859907_m2.jpg
-rw-r--r-- 1 lukas staff 225903 6 May 20:51 1778089861390_m1.jpg
-rw-r--r-- 1 lukas staff 163493 6 May 20:51 1778089891253_m2.jpg
-rw-r--r-- 1 lukas staff 225659 6 May 20:51 1778089893127_m1.jpg
-rw-r--r-- 1 lukas staff 163445 6 May 20:52 1778089922831_m2.jpg
-rw-r--r-- 1 lukas staff 225719 6 May 20:52 1778089925227_m1.jpg
-rw-r--r-- 1 lukas staff 163452 6 May 20:52 1778089954782_m2.jpg
-rw-r--r-- 1 lukas staff 225714 6 May 20:52 1778089956766_m1.jpg
-rw-r--r-- 1 lukas staff 163417 6 May 20:53 1778089985966_m2.jpg
-rw-r--r-- 1 lukas staff 225741 6 May 20:53 1778089988057_m1.jpg
-rw-r--r-- 1 lukas staff 163393 6 May 20:53 1778090017780_m2.jpg
-rw-r--r-- 1 lukas staff 225912 6 May 20:53 1778090019726_m1.jpg
-rw-r--r-- 1 lukas staff 163432 6 May 20:54 1778090049955_m2.jpg
-rw-r--r-- 1 lukas staff 225914 6 May 20:54 1778090052527_m1.jpg
-rw-r--r--@ 1 lukas staff 1038222 6 May 20:40 compact_monitor_1_1778089220643.mp4
-rw-r--r-- 1 lukas staff 1600165 6 May 20:45 compact_monitor_1_1778089522686.mp4
-rw-r--r-- 1 lukas staff 352054 6 May 20:50 compact_monitor_1_1778089827658.mp4
-rw-r--r-- 1 lukas staff 327159 6 May 20:40 compact_monitor_2_1778089221749.mp4
-rw-r--r-- 1 lukas staff 1262068 6 May 20:45 compact_monitor_2_1778089524717.mp4
-rw-r--r-- 1 lukas staff 224813 6 May 20:50 compact_monitor_2_1778089828654.mp4
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data/data/2026-05-06 $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14643
|
652
|
2
|
2026-05-10T18:10:29.366266+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436629366_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.4787234,"height":-0.06304872},"on_screen":true,"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-7569550994675707174
|
-2989653432497681399
|
click
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14649
|
652
|
5
|
2026-05-10T18:10:35.802001+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436635802_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.4787234,"height":-0.06304872},"on_screen":true,"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-7569550994675707174
|
-2989653432497681399
|
click
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
14647
|
NULL
|
NULL
|
NULL
|
|
14642
|
651
|
4
|
2026-05-10T18:10:29.339594+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436629339_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"lines":[{"char_start":0,"char_count":43,"bounds":{"left":0.0034722222,"top":0.08777778,"width":0.23888889,"height":0.02}},{"char_start":43,"char_count":1,"bounds":{"left":0.0034722222,"top":0.107777774,"width":0.0055555557,"height":0.02}},{"char_start":44,"char_count":75,"bounds":{"left":0.0034722222,"top":0.12777779,"width":0.41666666,"height":0.02}},{"char_start":119,"char_count":1,"bounds":{"left":0.0034722222,"top":0.14777778,"width":0.0055555557,"height":0.02}},{"char_start":120,"char_count":75,"bounds":{"left":0.0034722222,"top":0.16777778,"width":0.41666666,"height":0.02}},{"char_start":195,"char_count":44,"bounds":{"left":0.0034722222,"top":0.18777777,"width":0.24444444,"height":0.02}}],"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-7569550994675707174
|
-2989653432497681399
|
click
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14648
|
651
|
7
|
2026-05-10T18:10:35.770371+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436635770_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"lines":[{"char_start":0,"char_count":43,"bounds":{"left":0.0034722222,"top":0.08777778,"width":0.23888889,"height":0.02}},{"char_start":43,"char_count":1,"bounds":{"left":0.0034722222,"top":0.107777774,"width":0.0055555557,"height":0.02}},{"char_start":44,"char_count":75,"bounds":{"left":0.0034722222,"top":0.12777779,"width":0.41666666,"height":0.02}},{"char_start":119,"char_count":1,"bounds":{"left":0.0034722222,"top":0.14777778,"width":0.0055555557,"height":0.02}},{"char_start":120,"char_count":75,"bounds":{"left":0.0034722222,"top":0.16777778,"width":0.41666666,"height":0.02}},{"char_start":195,"char_count":44,"bounds":{"left":0.0034722222,"top":0.18777777,"width":0.24444444,"height":0.02}}],"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-7569550994675707174
|
-2989653432497681399
|
click
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
14646
|
NULL
|
NULL
|
NULL
|
|
14664
|
NULL
|
0
|
2026-05-10T18:10:56.924110+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436656924_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.4787234,"height":-0.06304872},"on_screen":true,"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-2112041771393781776
|
-2989303653909493731
|
click
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14936
|
671
|
7
|
2026-05-11T06:06:36.527951+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778479596527_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.4787234,"height":-0.06304872},"on_screen":true,"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.50398934,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
5134103372534729140
|
-2989303653909411683
|
click
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
14932
|
NULL
|
NULL
|
NULL
|
|
14651
|
651
|
9
|
2026-05-10T18:10:42.218541+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436642218_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"lines":[{"char_start":0,"char_count":43,"bounds":{"left":0.0034722222,"top":0.08777778,"width":0.23888889,"height":0.02}},{"char_start":43,"char_count":1,"bounds":{"left":0.0034722222,"top":0.107777774,"width":0.0055555557,"height":0.02}},{"char_start":44,"char_count":75,"bounds":{"left":0.0034722222,"top":0.12777779,"width":0.41666666,"height":0.02}},{"char_start":119,"char_count":1,"bounds":{"left":0.0034722222,"top":0.14777778,"width":0.0055555557,"height":0.02}},{"char_start":120,"char_count":75,"bounds":{"left":0.0034722222,"top":0.16777778,"width":0.41666666,"height":0.02}},{"char_start":195,"char_count":85,"bounds":{"left":0.0034722222,"top":0.18777777,"width":0.4722222,"height":0.02}},{"char_start":280,"char_count":12,"bounds":{"left":0.0034722222,"top":0.20777778,"width":0.06666667,"height":0.02}},{"char_start":292,"char_count":13,"bounds":{"left":0.0034722222,"top":0.22777778,"width":0.072222225,"height":0.02}},{"char_start":305,"char_count":126,"bounds":{"left":0.0034722222,"top":0.24777777,"width":0.7,"height":0.02}},{"char_start":431,"char_count":132,"bounds":{"left":0.0034722222,"top":0.26777777,"width":0.73333335,"height":0.02}},{"char_start":563,"char_count":4,"bounds":{"left":0.0034722222,"top":0.28777778,"width":0.022222223,"height":0.02}},{"char_start":567,"char_count":19,"bounds":{"left":0.0034722222,"top":0.3077778,"width":0.10555556,"height":0.02}},{"char_start":586,"char_count":19,"bounds":{"left":0.0034722222,"top":0.32777777,"width":0.10555556,"height":0.02}},{"char_start":605,"char_count":19,"bounds":{"left":0.0034722222,"top":0.34777778,"width":0.10555556,"height":0.02}},{"char_start":624,"char_count":19,"bounds":{"left":0.0034722222,"top":0.36777776,"width":0.10555556,"height":0.02}},{"char_start":643,"char_count":44,"bounds":{"left":0.0034722222,"top":0.38777778,"width":0.24444444,"height":0.02}}],"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \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},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-2112041771393781776
|
-2989303653909493731
|
visual_change
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
14650
|
NULL
|
NULL
|
NULL
|
|
14663
|
651
|
16
|
2026-05-10T18:10:56.946292+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436656946_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"lines":[{"char_start":0,"char_count":43,"bounds":{"left":0.0034722222,"top":0.08777778,"width":0.23888889,"height":0.02}},{"char_start":43,"char_count":1,"bounds":{"left":0.0034722222,"top":0.107777774,"width":0.0055555557,"height":0.02}},{"char_start":44,"char_count":75,"bounds":{"left":0.0034722222,"top":0.12777779,"width":0.41666666,"height":0.02}},{"char_start":119,"char_count":1,"bounds":{"left":0.0034722222,"top":0.14777778,"width":0.0055555557,"height":0.02}},{"char_start":120,"char_count":75,"bounds":{"left":0.0034722222,"top":0.16777778,"width":0.41666666,"height":0.02}},{"char_start":195,"char_count":85,"bounds":{"left":0.0034722222,"top":0.18777777,"width":0.4722222,"height":0.02}},{"char_start":280,"char_count":12,"bounds":{"left":0.0034722222,"top":0.20777778,"width":0.06666667,"height":0.02}},{"char_start":292,"char_count":13,"bounds":{"left":0.0034722222,"top":0.22777778,"width":0.072222225,"height":0.02}},{"char_start":305,"char_count":126,"bounds":{"left":0.0034722222,"top":0.24777777,"width":0.7,"height":0.02}},{"char_start":431,"char_count":132,"bounds":{"left":0.0034722222,"top":0.26777777,"width":0.73333335,"height":0.02}},{"char_start":563,"char_count":4,"bounds":{"left":0.0034722222,"top":0.28777778,"width":0.022222223,"height":0.02}},{"char_start":567,"char_count":19,"bounds":{"left":0.0034722222,"top":0.3077778,"width":0.10555556,"height":0.02}},{"char_start":586,"char_count":19,"bounds":{"left":0.0034722222,"top":0.32777777,"width":0.10555556,"height":0.02}},{"char_start":605,"char_count":19,"bounds":{"left":0.0034722222,"top":0.34777778,"width":0.10555556,"height":0.02}},{"char_start":624,"char_count":19,"bounds":{"left":0.0034722222,"top":0.36777776,"width":0.10555556,"height":0.02}},{"char_start":643,"char_count":44,"bounds":{"left":0.0034722222,"top":0.38777778,"width":0.24444444,"height":0.02}}],"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \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},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-2112041771393781776
|
-2989303653909493731
|
click
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14935
|
670
|
8
|
2026-05-11T06:06:36.537237+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778479596537_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"lines":[{"char_start":0,"char_count":43,"bounds":{"left":0.0034722222,"top":0.08777778,"width":0.23888889,"height":0.02}},{"char_start":43,"char_count":1,"bounds":{"left":0.0034722222,"top":0.107777774,"width":0.0055555557,"height":0.02}},{"char_start":44,"char_count":75,"bounds":{"left":0.0034722222,"top":0.12777779,"width":0.41666666,"height":0.02}},{"char_start":119,"char_count":1,"bounds":{"left":0.0034722222,"top":0.14777778,"width":0.0055555557,"height":0.02}},{"char_start":120,"char_count":75,"bounds":{"left":0.0034722222,"top":0.16777778,"width":0.41666666,"height":0.02}},{"char_start":195,"char_count":85,"bounds":{"left":0.0034722222,"top":0.18777777,"width":0.4722222,"height":0.02}},{"char_start":280,"char_count":12,"bounds":{"left":0.0034722222,"top":0.20777778,"width":0.06666667,"height":0.02}},{"char_start":292,"char_count":13,"bounds":{"left":0.0034722222,"top":0.22777778,"width":0.072222225,"height":0.02}},{"char_start":305,"char_count":126,"bounds":{"left":0.0034722222,"top":0.24777777,"width":0.7,"height":0.02}},{"char_start":431,"char_count":132,"bounds":{"left":0.0034722222,"top":0.26777777,"width":0.73333335,"height":0.02}},{"char_start":563,"char_count":4,"bounds":{"left":0.0034722222,"top":0.28777778,"width":0.022222223,"height":0.02}},{"char_start":567,"char_count":19,"bounds":{"left":0.0034722222,"top":0.3077778,"width":0.10555556,"height":0.02}},{"char_start":586,"char_count":19,"bounds":{"left":0.0034722222,"top":0.32777777,"width":0.10555556,"height":0.02}},{"char_start":605,"char_count":19,"bounds":{"left":0.0034722222,"top":0.34777778,"width":0.10555556,"height":0.02}},{"char_start":624,"char_count":19,"bounds":{"left":0.0034722222,"top":0.36777776,"width":0.10555556,"height":0.02}},{"char_start":643,"char_count":44,"bounds":{"left":0.0034722222,"top":0.38777778,"width":0.24444444,"height":0.02}}],"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL\nt COUNT(*)\n-------- --------\nocr_text 990 \nelements 545397 \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},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
5134103372534729140
|
-2989303653909411683
|
click
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
t COUNT(*)
-------- --------
ocr_text 990
elements 545397
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14650
|
651
|
8
|
2026-05-10T18:10:39.170976+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436639170_m1.jpg...
|
iTerm2
|
sqlite3
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
sqlite3
Close Tab
⌥⌘1
sqlite3...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"lines":[{"char_start":0,"char_count":43,"bounds":{"left":0.0034722222,"top":0.08777778,"width":0.23888889,"height":0.02}},{"char_start":43,"char_count":1,"bounds":{"left":0.0034722222,"top":0.107777774,"width":0.0055555557,"height":0.02}},{"char_start":44,"char_count":75,"bounds":{"left":0.0034722222,"top":0.12777779,"width":0.41666666,"height":0.02}},{"char_start":119,"char_count":1,"bounds":{"left":0.0034722222,"top":0.14777778,"width":0.0055555557,"height":0.02}},{"char_start":120,"char_count":75,"bounds":{"left":0.0034722222,"top":0.16777778,"width":0.41666666,"height":0.02}},{"char_start":195,"char_count":85,"bounds":{"left":0.0034722222,"top":0.18777777,"width":0.4722222,"height":0.02}},{"char_start":280,"char_count":12,"bounds":{"left":0.0034722222,"top":0.20777778,"width":0.06666667,"height":0.02}},{"char_start":292,"char_count":13,"bounds":{"left":0.0034722222,"top":0.22777778,"width":0.072222225,"height":0.02}},{"char_start":305,"char_count":126,"bounds":{"left":0.0034722222,"top":0.24777777,"width":0.7,"height":0.02}},{"char_start":431,"char_count":132,"bounds":{"left":0.0034722222,"top":0.26777777,"width":0.73333335,"height":0.02}},{"char_start":563,"char_count":3,"bounds":{"left":0.0034722222,"top":0.28777778,"width":0.016666668,"height":0.02}}],"value":"Last login: Fri May 8 22:00:18 on ttys012\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'\n.headers on\n.mode column\nSELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')\nUNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');\nSQL","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"sqlite3","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"sqlite3","depth":1,"bounds":{"left":0.4826389,"top":0.033333335,"width":0.034027778,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-8865685647383379576
|
-972253968636670972
|
visual_change
|
accessibility
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
Poetry Last login: Fri May 8 22:00:18 on ttys012
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sqlite3 ~/.screenpipe/db.sqlite <<'SQL'
.headers on
.mode column
SELECT 'ocr_text' AS t, COUNT(*) FROM ocr_text WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08')
UNION ALL SELECT 'elements', COUNT(*) FROM elements WHERE frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '2026-05-08');
SQL
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
sqlite3
Close Tab
⌥⌘1
sqlite3...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14641
|
651
|
3
|
2026-05-10T18:10:27.084121+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436627084_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
DOCKER
Last login: Fri May 8 22:00:18 on ttys012
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Fri May 8 22:00:18 on ttys012","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"value":"Last login: Fri May 8 22:00:18 on ttys012","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-5901130443447479519
|
-8214398551535238367
|
visual_change
|
hybrid
|
NULL
|
Last login: Fri May 8 22:00:18 on ttys012
DOCKER
Last login: Fri May 8 22:00:18 on ttys012
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh
iTerm2DOCKERShellEdit• ₴1ViewSessionScriptsProfilesWindowHelpDEV (-zsh)O 82APP (-zsh)• *3-zsh• ×4-zshhhlscreenpipe"86ssh100% (<47*8•Sun 10 May 21:10:26T&187login*8...
|
14639
|
NULL
|
NULL
|
NULL
|
|
14699
|
654
|
16
|
2026-05-10T18:14:11.534352+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436851534_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.5049867,"top":1.0,"width":0.008976064,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
visual_change
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14706
|
654
|
18
|
2026-05-10T18:14:57.010402+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436897010_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.5049867,"top":1.0,"width":0.008976064,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
click
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14708
|
654
|
19
|
2026-05-10T18:15:01.962801+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436901962_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.5049867,"top":1.0,"width":0.008976064,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
click
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14716
|
654
|
23
|
2026-05-10T18:15:18.143406+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436918143_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.5049867,"top":1.0,"width":0.008976064,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
click
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14701
|
653
|
17
|
2026-05-10T18:14:44.486458+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436884486_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
visual_change
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
14700
|
NULL
|
NULL
|
NULL
|
|
14705
|
653
|
20
|
2026-05-10T18:14:56.972681+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436896972_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
click
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
14704
|
NULL
|
NULL
|
NULL
|
|
14707
|
653
|
21
|
2026-05-10T18:14:59.578690+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436899578_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
visual_change
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14715
|
653
|
25
|
2026-05-10T18:15:18.101033+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436918101_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
click
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14700
|
653
|
16
|
2026-05-10T18:14:14.317828+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436854317_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"value":"D window_name IS NOT NULL\\\\n\\\" rows_affected=0 rows_returned \n riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\\n2026-05-07T21:50:34.470706Z INFO scre \n (hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf \n ety-net poll)\\n2026-05-07T21:50:34.479630Z INFO screenpipe_ \n tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream \n screenpipe install https://screenpi.pe/start.json s after unlock/wake for monitor 1\\n2026-05-07T21:50:34.49504 \n 0Z INFO sck_rs::stream_manager: stopped 1 persistent stream \n 2026-05-07T21:00:48.741587Z INFO screenpipe_engine::event_d (s)\\n2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manage \n riven_capture: content dedup: skipping capture for monitor 2 r: persistent SCK stream started for display 1 (1440x900, 2f \n (hash=2730807366803551277, trigger=click) ps, 2 excluded)\\n2026-05-07T21:50:37.714776Z INFO sck_rs::s \n 2026-05-07T21:00:55.766541Z INFO screenpipe_engine::event_d tream_manager: persistent SCK stream started for display 2 ( \n riven_capture: content dedup: skipping capture for monitor 1 3008x1253, 2fps, 2 excluded)\\nzsh: terminated npx screenpip \n (hash=2730807366803551277, trigger=click) e@latest record --disable-audio --ignored-windows \\\"Boostero \n 2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\\\"\\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\\ \n riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\\nwarning: parakeet is not suppo \n (hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\\n2026-05-0 \n 2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au \n riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\\nchecking permissions...\\n \n (hash=2730807366803551277, trigger=click) screen recording: ok\\n accessibility: ok\\n2026-05-08T09:2 \n 2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version \n t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\\n2026-05-08T09:25:45.851716Z \n 2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep \n t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\\n2026-05-08T09:25:45.853302Z INFO screenpipe_ \n (6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register \n 2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\\n2026-05-08T09:25:45.853909Z INFO \n t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w \n (6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback) \n \\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi \n tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr \n screenpipe login ue accessibility=true keychain=true\\n2026-05-08T09:25:45.874 \n 606Z INFO screenpipe: meeting detector enabled — independen \n 2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\\n2026-05-08T09:25:45.874891Z INFO s \n riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on 127.0.0.1:3030 (localhost \n (hash=2730807366803551277, trigger=click) only)\\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au \n 2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\\n2 \n riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m \n (hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\\n2026-05- \n 2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager: \n riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\\n2026-05-08T09:25:45.874854 \n (hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com \n 2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\\n2026-05-08 \n riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe: \n (hash=-3190010697038351257, trigger=click) day-recap\\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor \n 2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\\n2026-05-08T09:25:45.8 \n riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\\ \n (hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l \n 2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\\n2026-05-08T09:25:45.878921Z INF \n t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\\n2026-05 \n 2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\\n2026-05-08T09:25:45.879015Z INFO scree \n (5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \\\"/Users/lukas/.scree \n 2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\\\"\\n\\n\\n\\n \n t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \\n __________________ ___ ____ ____ \n 4.4x), 9 JPEGs deleted (_____ ___ \\n / ___/ ___/ ___/ _ \\\\/ _ \\\\/ __ \\\\ / __ \\ \n \\/ / __ \\\\/ _ \\\\\\n (__ / /__/ / / __/ __/ / / / / /_/ / \n tip: get the screenpipe desktop app for the full experienc / /_/ / __/\\n/____/\\\\___/_/ \\\\___/\\\\___/_/ /_/ / .___/_ \n e / .___/\\\\___/ \\n /_/ /_/ \n https://screenpi.pe \\n\\n\\n\\npower AI by everything you've seen, said \n or heard\\nopen source | runs locally | developer friendly\\n\\ \n 2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\\n┌────────────────────────┬─────────────────────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ─────┐\\n│ setting │ value \n (hash=2730807366803551277, trigger=click) │\\n├────────────────────────┼───────────────────── \n 2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\\n│ audio chunk duration │ 30 seconds \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ port │ 3030 \n (hash=-6936887013967671323, trigger=click) │\\n│ audio disabled │ true \n 2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\\n│ vision disabled │ \n riven_capture: content dedup: skipping capture for monitor 2 false │\\n│ pause on DRM content \n (hash=-6936887013967671323, trigger=click) │ false │\\n│ audio engine \n 2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\\n│ vad engine \n t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\\n│ data \n 2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\\n│ \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false \n (8.0x), 14 JPEGs deleted │\\n│ telemetry │ true \n 2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\\n│ use pii removal │ true \n t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\\n│ use all monitors │ true \n (4.4x), 13 JPEGs deleted │\\n2026-05-08T09:25:45.881529Z INFO screenpi \n 2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\\n│ ign \n riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\\\"Boosteroid\\\"] │ \n (hash=-6936887013967671323, trigger=click) \\n│ included windows │ [] \n │\\n│ cloud sync │ disabled \n tip: wire screenpipe into claude with one command: │\\n│ auto-destruct pid │ 0 \n claude mcp add screenpipe -- npx -y screenpipe-mcp │\\n│ deepgram key │ not set \n then ask claude to build a pipe that tracks who you a │\\n│ api auth │ enabled \n re, your todos, and how you spend your time from your screen │\\n│ encrypt secrets │ disabl \n activity ed │\\n│ retention days │ 1 \n 4 │\\n│ retention mode \n 2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\\n├───────────────── \n riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\\n│ languages \n (hash=6913338268963121281, trigger=click) │ │\\n│ \n 2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\\n├── \n riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤ \n (hash=6913338268963121281, trigger=click) \\n│ monitors │ \n 2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\\n│ │ id: 1 \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ id: 2 \n (hash=6913338268963121281, trigger=visual_change) │\\n├────────────────────────┼───────────────── \n 2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\\n│ audio devices │ \n riven_capture: content dedup: skipping capture for monitor 2 │\\n│ │ disabl \n (hash=6913338268963121281, trigger=visual_change) ed │\\n└────────────────────────┴── \n 2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\\nyou are using local pro \n riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\\n\\nwarning: t \n (hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\\nto \n 2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\\n\\ncheck latest \n riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea \n (hash=6913338268963121281, trigger=visual_change) ses\\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting \n 2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\\n2026-05-08T09:25:45.888762Z INFO screenpi \n riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc \n (hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\\n2026-05-08T09:25:45.89128 \n 2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found \n riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\\n2026-05-08T09:25:45.896583Z \n (hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu \n 2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_ \n riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8 \n (hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\\n2026-05-08T09:25:45.913483Z INFO screenpi \n 2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star \n riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\\n2026-05-08T09:25:45.913512Z INFO \n (hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin \n 2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2 \n t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\\n2026-05-08T09:25:45.914574Z INFO screenpi \n 2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star \n t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\\n2026-05-08T09:25:45.923 \n (4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12 \n 2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho 7.0.0.1:3030\\n2026-05-08T09:25:45.927056Z INFO screenpipe_c \n t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\\n202 \n (3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man \n ager::manager: Starting vision recording for monitor 1 (1440 \n tip: install a starter bundle of pipes: x900)\\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine:: \n screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m \n onitor 1 (device: monitor_1)\\n2026-05-08T09:25:46.311076Z I \n 2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca \n riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\\n2026-05-08T \n (hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma \n 2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\\n \n riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n (hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor \n 2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\\n2026-05-08T09:25:46.472981Z INFO scr \n riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start \n (hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\\n2026-05-08T09:25:46.472989Z INFO sc \n 2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m \n riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur \n (hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\\n2026-05-08T09:25:46.47301 \n 2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv \n riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\\n2026-0 \n (hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste \n 2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu \n riven_capture: content dedup: skipping capture for monitor 2 ded)\"} \n (hash=6913338268963121281, trigger=visual_change) \n 2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=6913338268963121281, trigger=click) \n 2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:28.410976Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:36.882207Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:37.074891Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.366576Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:48.495008Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 1 \n (hash=5795911359130326036, trigger=click) \n 2026-05-07T21:23:49.547721Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:01.423031Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:04.466413Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:24:56.787200Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 28 eligible frames \n 2026-05-07T21:24:57.817202Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB \n (7.7x), 14 JPEGs deleted \n 2026-05-07T21:24:59.081061Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 12 frames, 2.3MB → 0.7MB \n (3.3x), 12 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:27:02.818198Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:27:05.774711Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:28:30.450527Z INFO screenpipe_engine::event_d \n riven_capture: content dedup: skipping capture for monitor 2 \n (hash=5795911359130326036, trigger=visual_change) \n 2026-05-07T21:29:59.102962Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 25 eligible frames \n 2026-05-07T21:29:59.987011Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.6x), 10 JPEGs deleted \n 2026-05-07T21:30:01.159682Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 13 frames, 2.6MB → 0.9MB \n (2.7x), 13 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:35:01.331399Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 20 eligible frames \n 2026-05-07T21:35:02.457282Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.4x), 10 JPEGs deleted \n 2026-05-07T21:35:03.532280Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.8MB ( \n 2.1x), 8 JPEGs deleted \n \n tip: wire screenpipe into claude with one command: \n claude mcp add screenpipe -- npx -y screenpipe-mcp \n then ask claude to build a pipe that tracks who you a \n re, your todos, and how you spend your time from your screen \n activity \n \n 2026-05-07T21:39:18.435385Z INFO screenpipe_engine::sleep_m \n onitor: Screen locked (CGSession safety-net poll) \n 2026-05-07T21:39:34.938546Z INFO sck_rs::stream_manager: re \n creating stream for display 2 (resolution change) \n 2026-05-07T21:40:03.554507Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:40:04.411131Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (5.7x), 10 JPEGs deleted \n 2026-05-07T21:40:05.319315Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.6MB \n (3.5x), 10 JPEGs deleted \n \n tip: install a starter bundle of pipes: \n screenpipe install https://screenpi.pe/start.json \n \n 2026-05-07T21:45:05.336676Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 22 eligible frames \n 2026-05-07T21:45:06.184141Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB \n (6.0x), 10 JPEGs deleted \n 2026-05-07T21:45:06.960114Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 10 frames, 2.0MB → 0.3MB \n (6.4x), 10 JPEGs deleted \n \n tip: sign in for higher AI quotas + cloud sync: \n screenpipe login \n \n 2026-05-07T21:50:06.992344Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: found 18 eligible frames \n 2026-05-07T21:50:07.821021Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.7MB → 0.4MB ( \n 4.6x), 8 JPEGs deleted \n 2026-05-07T21:50:08.563068Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction: 8 frames, 1.6MB → 0.3MB ( \n 5.1x), 8 JPEGs deleted \n \n tip: get the screenpipe desktop app for the full experienc \n e \n https://screenpi.pe \n \n 2026-05-07T21:50:34.305285Z WARN sqlx::query: summary=\"SELE \n CT DISTINCT app_name, window_name, …\" db.statement=\"\\n\\nSELE \n CT\\n DISTINCT app_name,\\n window_name,\\n browser_url\\nFRO \n M\\n frames\\nWHERE\\n timestamp > datetime('now', '-30 secon \n ds')\\n AND app_name IS NOT NULL\\n AND window_name IS NOT N \n ULL\\n\" rows_affected=0 rows_returned=182 elapsed=1.9089s \n 2026-05-07T21:50:34.470706Z INFO screenpipe_engine::sleep_m \n onitor: Screen unlocked (CGSession safety-net poll) \n 2026-05-07T21:50:34.479630Z INFO screenpipe_engine::event_d \n riven_capture: invalidating persistent streams after unlock/ \n wake for monitor 1 \n 2026-05-07T21:50:34.495040Z INFO sck_rs::stream_manager: st \n opped 1 persistent stream(s) \n 2026-05-07T21:50:36.741433Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \n 2026-05-07T21:50:37.714776Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 2 (3008x1253, 2fps, \n 2 excluded) \n zsh: terminated npx screenpipe@latest record --disable-audi \n o --ignored-windows \"Boosteroid\" \n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start \n detected hardware tier: Mid \n warning: parakeet is not supported on this platform, using w \n hisper-tiny instead \n 2026-05-08T09:25:44.404966Z INFO screenpipe_engine::auth_ke \n y: api auth: key resolved via secret store \n checking permissions... \n screen recording: ok \n accessibility: ok \n 2026-05-08T09:25:44.477216Z INFO screenpipe_screen::monitor \n ::macos_version: Detected macOS version: 14.6 \n 2026-05-08T09:25:45.851716Z INFO screenpipe_engine::sleep_m \n onitor: Starting macOS sleep/wake monitor \n 2026-05-08T09:25:45.853302Z INFO screenpipe_engine::sleep_m \n onitor: Screen lock/unlock observers registered (CFNotificat \n ionCenter) \n 2026-05-08T09:25:45.853909Z INFO screenpipe_engine::sleep_m \n onitor: Display reconfiguration watcher registered (CGDispla \n yRegisterReconfigurationCallback) \n 2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permiss \n ion_monitor: permission monitor started screen=true mic=true \n accessibility=true keychain=true \n 2026-05-08T09:25:45.874606Z INFO screenpipe: meeting detect \n or enabled — independent of transcription mode \n 2026-05-08T09:25:45.874891Z INFO screenpipe: API server lis \n tening on 127.0.0.1:3030 (localhost only) \n 2026-05-08T09:25:45.874915Z INFO screenpipe: API auth enabl \n ed — run `screenpipe auth token` to view your key \n 2026-05-08T09:25:45.874789Z INFO screenpipe_engine::power:: \n manager: power manager started (poll interval: 10s) \n 2026-05-08T09:25:45.874931Z INFO screenpipe_engine::vision_ \n manager::manager: Starting VisionManager \n 2026-05-08T09:25:45.874854Z INFO screenpipe_engine::snapsho \n t_compaction: snapshot compaction worker started (min_age=60 \n 0s, poll=300s) \n 2026-05-08T09:25:45.877906Z INFO screenpipe_core::pipes: lo \n aded pipe: day-recap \n 2026-05-08T09:25:45.878202Z INFO screenpipe_core::pipes: lo \n aded pipe: standup-update \n 2026-05-08T09:25:45.878737Z INFO screenpipe_core::pipes: lo \n aded pipe: ai-habits \n 2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: lo \n aded pipe: time-breakdown \n 2026-05-08T09:25:45.878921Z INFO screenpipe_core::pipes: lo \n aded pipe: video-export \n 2026-05-08T09:25:45.878997Z INFO screenpipe_core::pipes: lo \n aded pipe: meeting-summary \n 2026-05-08T09:25:45.879015Z INFO screenpipe_core::pipes: lo \n aded 6 pipes from \"/Users/lukas/.screenpipe/pipes\" \n \n \n \n _ \n __________________ ___ ____ ____ (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \\/ / __ \\/ _ \\ \n (__ / /__/ / / __/ __/ / / / / /_/ / / /_/ / __/ \n /____/\\___/_/ \\___/\\___/_/ /_/ / .___/_/ .___/\\___/ \n /_/ /_/ \n \n \n \n power AI by everything you've seen, said or heard \n open source | runs locally | developer friendly \n \n \n ┌────────────────────────┬────────────────────────────────── \n ──┐ \n │ setting │ value \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio chunk duration │ 30 seconds \n │ \n │ port │ 3030 \n │ \n │ audio disabled │ true \n │ \n │ vision disabled │ false \n │ \n │ pause on DRM content │ false \n │ \n │ audio engine │ Parakeet \n │ \n │ vad engine │ Silero \n │ \n │ data directory │ /Users/lukas/.screenpipe \n │ \n │ debug mode │ false \n │ \n │ telemetry │ true \n │ \n │ use pii removal │ true \n │ \n │ use all monitors │ true \n │ \n 2026-05-08T09:25:45.881529Z INFO screenpipe_core::pipes: pi \n pe scheduler started (generation 2) \n │ ignored windows │ [\"Boosteroid\"] \n │ \n │ included windows │ [] \n │ \n │ cloud sync │ disabled \n │ \n │ auto-destruct pid │ 0 \n │ \n │ deepgram key │ not set \n │ \n │ api auth │ enabled \n │ \n │ encrypt secrets │ disabled \n │ \n │ retention days │ 14 \n │ \n │ retention mode │ media-only (keep transcripts) \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ languages │ \n │ \n │ │ all languages \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ monitors │ \n │ \n │ │ id: 1 \n │ \n │ │ id: 2 \n │ \n ├────────────────────────┼────────────────────────────────── \n ──┤ \n │ audio devices │ \n │ \n │ │ disabled \n │ \n └────────────────────────┴────────────────────────────────── \n ──┘ \n you are using local processing. all your data stays on your \n computer. \n \n warning: telemetry is enabled. only error-level data will be \n sent. \n to disable, use the --disable-telemetry flag. \n \n check latest changes here: https://github.com/screenpipe/scr \n eenpipe/releases \n 2026-05-08T09:25:45.881961Z INFO screenpipe: starting UI ev \n ent capture \n 2026-05-08T09:25:45.888762Z INFO screenpipe_engine::power:: \n manager: initial power profile: Performance (on_ac=true, bat \n tery=Some(100)) \n 2026-05-08T09:25:45.891286Z WARN screenpipe: pi agent insta \n ll failed: bun not found — install from https://bun.sh \n 2026-05-08T09:25:45.896583Z INFO screenpipe_engine::ui_reco \n rder: Starting UI event capture \n 2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_reco \n rder: UI recording session started: 03da4156-9bc1-4c59-86f8- \n 3b937ccacca2 \n 2026-05-08T09:25:45.913483Z INFO screenpipe_engine::calenda \n r_speaker_id: speaker identification: started (user_name=<no \n t set>) \n 2026-05-08T09:25:45.913512Z INFO screenpipe_engine::hot_fra \n me_cache: hot_frame_cache: warming from DB (2026-05-07 06:25 \n :45.913511 UTC to 2026-05-08 06:25:45.913511 UTC) \n 2026-05-08T09:25:45.914574Z INFO screenpipe_engine::meeting \n _detector: meeting v2: detection loop started (base_interval \n =5s, profiles=12) \n 2026-05-08T09:25:45.923208Z INFO screenpipe_engine::server: \n Server listening on 127.0.0.1:3030 \n 2026-05-08T09:25:45.927056Z INFO screenpipe_connect::mdns: \n mdns: advertising screenpipe on port 3030 \n 2026-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 1 (1 \n 440x900) \n 2026-05-08T09:25:46.311039Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 1 (device: monitor_1) \n 2026-05-08T09:25:46.311076Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 1 (d \n evice: monitor_1) \n 2026-05-08T09:25:46.472936Z INFO screenpipe_engine::vision_ \n manager::manager: Starting vision recording for monitor 2 (3 \n 008x1253) \n 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_ \n manager::manager: Starting event-driven capture for monitor \n 2 (device: monitor_2) \n 2026-05-08T09:25:46.472981Z INFO screenpipe_engine::vision_ \n manager::manager: VisionManager started with 2/2 monitor(s) \n 2026-05-08T09:25:46.472989Z INFO screenpipe_engine::vision_ \n manager::monitor_watcher: Starting monitor watcher (event-dr \n iven via CGDisplayRegisterReconfigurationCallback, 60s backs \n top poll) \n 2026-05-08T09:25:46.473017Z INFO screenpipe_engine::event_d \n riven_capture: event-driven capture started for monitor 2 (d \n evice: monitor_2) \n 2026-05-08T09:25:47.579143Z INFO sck_rs::stream_manager: pe \n rsistent SCK stream started for display 1 (1440x900, 2fps, 2 \n excluded) \nAdm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-7246826097812669706
|
5601208055224440121
|
visual_change
|
accessibility
|
NULL
|
D window_name IS NOT NULL\\n\" rows_affected=0 D window_name IS NOT NULL\\n\" rows_affected=0 rows_returned
riven_capture: content dedup: skipping capture for monitor 2 =182 elapsed=1.9089s\n2026-05-07T21:50:34.470706Z INFO scre
(hash=2730807366803551277, trigger=click) enpipe_engine::sleep_monitor: Screen unlocked (CGSession saf
ety-net poll)\n2026-05-07T21:50:34.479630Z INFO screenpipe_
tip: install a starter bundle of pipes: engine::event_driven_capture: invalidating persistent stream
screenpipe install [URL_WITH_CREDENTIALS] record --disable-audio --ignored-windows \"Boostero
2026-05-07T21:01:01.987730Z INFO screenpipe_engine::event_d id\"\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ sp-start\
riven_capture: content dedup: skipping capture for monitor 1 ndetected hardware tier: Mid\nwarning: parakeet is not suppo
(hash=2730807366803551277, trigger=click) rted on this platform, using whisper-tiny instead\n2026-05-0
2026-05-07T21:01:19.657174Z INFO screenpipe_engine::event_d 8T09:25:44.404966Z INFO screenpipe_engine::auth_key: api au
riven_capture: content dedup: skipping capture for monitor 2 th: key resolved via secret store\nchecking permissions...\n
(hash=2730807366803551277, trigger=click) screen recording: ok\n accessibility: ok\n2026-05-08T09:2
2026-05-07T21:04:45.665545Z INFO screenpipe_engine::snapsho 5:44.477216Z INFO screenpipe_screen::monitor::macos_version
t_compaction: snapshot compaction: found 24 eligible frames : Detected macOS version: 14.6\n2026-05-08T09:25:45.851716Z
2026-05-07T21:04:46.555243Z INFO screenpipe_engine::snapsho INFO screenpipe_engine::sleep_monitor: Starting macOS sleep
t_compaction: snapshot compaction: 11 frames, 2.4MB → 0.4MB /wake monitor\n2026-05-08T09:25:45.853302Z INFO screenpipe_
(6.5x), 11 JPEGs deleted engine::sleep_monitor: Screen lock/unlock observers register
2026-05-07T21:04:47.505518Z INFO screenpipe_engine::snapsho ed (CFNotificationCenter)\n2026-05-08T09:25:45.853909Z INFO
t_compaction: snapshot compaction: 11 frames, 2.1MB → 0.3MB screenpipe_engine::sleep_monitor: Display reconfiguration w
(6.3x), 11 JPEGs deleted atcher registered (CGDisplayRegisterReconfigurationCallback)
\n2026-05-08T09:25:45.874540Z INFO screenpipe_engine::permi
tip: sign in for higher AI quotas + cloud sync: ssion_monitor: permission monitor started screen=true mic=tr
screenpipe login ue accessibility=true keychain=true\n2026-05-08T09:25:45.874
606Z INFO screenpipe: meeting detector enabled — independen
2026-05-07T21:07:59.390425Z INFO screenpipe_engine::event_d t of transcription mode\n2026-05-08T09:25:45.874891Z INFO s
riven_capture: content dedup: skipping capture for monitor 1 creenpipe: API server listening on [IP_ADDRESS]:3030 (localhost
(hash=2730807366803551277, trigger=click) only)\n2026-05-08T09:25:45.874915Z INFO screenpipe: API au
2026-05-07T21:08:02.049042Z INFO screenpipe_engine::event_d th enabled — run `screenpipe auth token` to view your key\n2
riven_capture: content dedup: skipping capture for monitor 1 026-05-08T09:25:45.874789Z INFO screenpipe_engine::power::m
(hash=2730807366803551277, trigger=click) anager: power manager started (poll interval: 10s)\n2026-05-
2026-05-07T21:08:58.406336Z INFO screenpipe_engine::event_d 08T09:25:45.874931Z INFO screenpipe_engine::vision_manager:
riven_capture: content dedup: skipping capture for monitor 1 :manager: Starting VisionManager\n2026-05-08T09:25:45.874854
(hash=-3190010697038351257, trigger=click) Z INFO screenpipe_engine::snapshot_compaction: snapshot com
2026-05-07T21:08:58.638209Z INFO screenpipe_engine::event_d paction worker started (min_age=600s, poll=300s)\n2026-05-08
riven_capture: content dedup: skipping capture for monitor 2 T09:25:45.877906Z INFO screenpipe_core::pipes: loaded pipe:
(hash=-3190010697038351257, trigger=click) day-recap\n2026-05-08T09:25:45.878202Z INFO screenpipe_cor
2026-05-07T21:09:33.105308Z INFO screenpipe_engine::event_d e::pipes: loaded pipe: standup-update\n2026-05-08T09:25:45.8
riven_capture: content dedup: skipping capture for monitor 2 78737Z INFO screenpipe_core::pipes: loaded pipe: ai-habits\
(hash=2730807366803551277, trigger=click) n2026-05-08T09:25:45.878843Z INFO screenpipe_core::pipes: l
2026-05-07T21:09:47.541287Z INFO screenpipe_engine::snapsho oaded pipe: time-breakdown\n2026-05-08T09:25:45.878921Z INF
t_compaction: snapshot compaction: found 21 eligible frames O screenpipe_core::pipes: loaded pipe: video-export\n2026-05
2026-05-07T21:09:48.491343Z INFO screenpipe_engine::snapsho -08T09:25:45.878997Z INFO screenpipe_core::pipes: loaded pi
t_compaction: snapshot compaction: 10 frames, 2.2MB → 0.4MB pe: meeting-summary\n2026-05-08T09:25:45.879015Z INFO scree
(5.6x), 10 JPEGs deleted npipe_core::pipes: loaded 6 pipes from \"/Users/lukas/.scree
2026-05-07T21:09:49.574479Z INFO screenpipe_engine::snapsho npipe/pipes\"\n\n\n\n
t_compaction: snapshot compaction: 9 frames, 1.8MB → 0.4MB ( _ \n __________________ ___ ____ ____
4.4x), 9 JPEGs deleted (_____ ___ \n / ___/ ___/ ___/ _ \\/ _ \\/ __ \\ / __ \
\/ / __ \\/ _ \\\n (__ / /__/ / / __/ __/ / / / / /_/ /
tip: get the screenpipe desktop app for the full experienc / /_/ / __/\n/____/\\___/_/ \\___/\\___/_/ /_/ / .___/_
e / .___/\\___/ \n /_/ /_/
https://screenpi.pe \n\n\n\npower AI by everything you've seen, said
or heard\nopen source | runs locally | developer friendly\n\
2026-05-07T21:11:18.711785Z INFO screenpipe_engine::event_d n\n┌────────────────────────┬───────────────────────────────
riven_capture: content dedup: skipping capture for monitor 2 ─────┐\n│ setting │ value
(hash=2730807366803551277, trigger=click) │\n├────────────────────────┼─────────────────────
2026-05-07T21:11:43.731627Z INFO screenpipe_engine::event_d ───────────────┤\n│ audio chunk duration │ 30 seconds
riven_capture: content dedup: skipping capture for monitor 2 │\n│ port │ 3030
(hash=-6936887013967671323, trigger=click) │\n│ audio disabled │ true
2026-05-07T21:11:58.569054Z INFO screenpipe_engine::event_d │\n│ vision disabled │
riven_capture: content dedup: skipping capture for monitor 2 false │\n│ pause on DRM content
(hash=-6936887013967671323, trigger=click) │ false │\n│ audio engine
2026-05-07T21:14:49.597611Z INFO screenpipe_engine::snapsho │ Parakeet │\n│ vad engine
t_compaction: snapshot compaction: found 29 eligible frames │ Silero │\n│ data
2026-05-07T21:14:50.698785Z INFO screenpipe_engine::snapsho directory │ /Users/lukas/.screenpipe │\n│
t_compaction: snapshot compaction: 14 frames, 3.1MB → 0.4MB debug mode │ false
(8.0x), 14 JPEGs deleted │\n│ telemetry │ true
2026-05-07T21:14:53.637486Z INFO screenpipe_engine::snapsho │\n│ use pii removal │ true
t_compaction: snapshot compaction: 13 frames, 2.5MB → 0.6MB │\n│ use all monitors │ true
(4.4x), 13 JPEGs deleted │\n2026-05-08T09:25:45.881529Z INFO screenpi
2026-05-07T21:15:02.521080Z INFO screenpipe_engine::event_d pe_core::pipes: pipe scheduler started (generation 2)\n│ ign
riven_capture: content dedup: skipping capture for monitor 1 ored windows │ [\"Boosteroid\"] │
(hash=-6936887013967671323, trigger=click) \n│ included windows │ []
│\n│ cloud sync │ disabled
tip: wire screenpipe into claude with one command: │\n│ auto-destruct pid │ 0
claude mcp add screenpipe -- npx -y screenpipe-mcp │\n│ deepgram key │ not set
then ask claude to build a pipe that tracks who you a │\n│ api auth │ enabled
re, your todos, and how you spend your time from your screen │\n│ encrypt secrets │ disabl
activity ed │\n│ retention days │ 1
4 │\n│ retention mode
2026-05-07T21:15:56.220866Z INFO screenpipe_engine::event_d │ media-only (keep transcripts) │\n├─────────────────
riven_capture: content dedup: skipping capture for monitor 2 ───────┼────────────────────────────────────┤\n│ languages
(hash=6913338268963121281, trigger=click) │ │\n│
2026-05-07T21:16:19.271233Z INFO screenpipe_engine::event_d │ all languages │\n├──
riven_capture: content dedup: skipping capture for monitor 1 ──────────────────────┼────────────────────────────────────┤
(hash=6913338268963121281, trigger=click) \n│ monitors │
2026-05-07T21:17:24.638614Z INFO screenpipe_engine::event_d │\n│ │ id: 1
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ id: 2
(hash=6913338268963121281, trigger=visual_change) │\n├────────────────────────┼─────────────────
2026-05-07T21:17:30.785805Z INFO screenpipe_engine::event_d ───────────────────┤\n│ audio devices │
riven_capture: content dedup: skipping capture for monitor 2 │\n│ │ disabl
(hash=6913338268963121281, trigger=visual_change) ed │\n└────────────────────────┴──
2026-05-07T21:17:33.819916Z INFO screenpipe_engine::event_d ──────────────────────────────────┘\nyou are using local pro
riven_capture: content dedup: skipping capture for monitor 2 cessing. all your data stays on your computer.\n\nwarning: t
(hash=6913338268963121281, trigger=visual_change) elemetry is enabled. only error-level data will be sent.\nto
2026-05-07T21:18:40.291660Z INFO screenpipe_engine::event_d disable, use the --disable-telemetry flag.\n\ncheck latest
riven_capture: content dedup: skipping capture for monitor 2 changes here: https://github.com/screenpipe/screenpipe/relea
(hash=6913338268963121281, trigger=visual_change) ses\n2026-05-08T09:25:45.881961Z INFO screenpipe: starting
2026-05-07T21:18:44.647424Z INFO screenpipe_engine::event_d UI event capture\n2026-05-08T09:25:45.888762Z INFO screenpi
riven_capture: content dedup: skipping capture for monitor 2 pe_engine::power::manager: initial power profile: Performanc
(hash=6913338268963121281, trigger=click) e (on_ac=true, battery=Some(100))\n2026-05-08T09:25:45.89128
2026-05-07T21:18:44.850725Z INFO screenpipe_engine::event_d 6Z WARN screenpipe: pi agent install failed: bun not found
riven_capture: content dedup: skipping capture for monitor 1 — install from https://bun.sh\n2026-05-08T09:25:45.896583Z
(hash=6913338268963121281, trigger=click) INFO screenpipe_engine::ui_recorder: Starting UI event captu
2026-05-07T21:18:46.523321Z INFO screenpipe_engine::event_d re\n2026-05-08T09:25:45.913159Z INFO screenpipe_engine::ui_
riven_capture: content dedup: skipping capture for monitor 2 recorder: UI recording session started: 03da4156-9bc1-4c59-8
(hash=6913338268963121281, trigger=visual_change) 6f8-3b937ccacca2\n2026-05-08T09:25:45.913483Z INFO screenpi
2026-05-07T21:18:49.556444Z INFO screenpipe_engine::event_d pe_engine::calendar_speaker_id: speaker identification: star
riven_capture: content dedup: skipping capture for monitor 2 ted (user_name=<not set>)\n2026-05-08T09:25:45.913512Z INFO
(hash=6913338268963121281, trigger=visual_change) screenpipe_engine::hot_frame_cache: hot_frame_cache: warmin
2026-05-07T21:19:53.705827Z INFO screenpipe_engine::snapsho g from DB (2026-05-07 06:25:45.913511 UTC to 2026-05-08 06:2
t_compaction: snapshot compaction: found 42 eligible frames 5:45.913511 UTC)\n2026-05-08T09:25:45.914574Z INFO screenpi
2026-05-07T21:19:55.056907Z INFO screenpipe_engine::snapsho pe_engine::meeting_detector: meeting v2: detection loop star
t_compaction: snapshot compaction: 20 frames, 3.6MB → 0.9MB ted (base_interval=5s, profiles=12)\n2026-05-08T09:25:45.923
(4.0x), 20 JPEGs deleted 208Z INFO screenpipe_engine::server: Server listening on 12
2026-05-07T21:19:56.759790Z INFO screenpipe_engine::snapsho [IP_ADDRESS]:3030\n2026-05-08T09:25:45.927056Z INFO screenpipe_c
t_compaction: snapshot compaction: 20 frames, 3.9MB → 1.1MB onnect::mdns: mdns: advertising screenpipe on port 3030\n202
(3.4x), 20 JPEGs deleted 6-05-08T09:25:46.310992Z INFO screenpipe_engine::vision_man
ager::manager: Starting vision recording for monitor 1 (1440
tip: install a starter bundle of pipes: x900)\n2026-05-08T09:25:46.311039Z INFO screenpipe_engine::
screenpipe install https://screenpi.pe/start.json vision_manager::manager: Starting event-driven capture for m
onitor 1 (device: monitor_1)\n2026-05-08T09:25:46.311076Z I
2026-05-07T21:20:29.459260Z INFO screenpipe_engine::event_d NFO screenpipe_engine::event_driven_capture: event-driven ca
riven_capture: content dedup: skipping capture for monitor 2 pture started for monitor 1 (device: monitor_1)\n2026-05-08T
(hash=6913338268963121281, trigger=visual_change) 09:25:46.472936Z INFO screenpipe_engine::vision_manager::ma
2026-05-07T21:20:41.532773Z INFO screenpipe_engine::event_d nager: Starting vision recording for monitor 2 (3008x1253)\n
riven_capture: content dedup: skipping capture for monitor 2 2026-05-08T09:25:46.472968Z INFO screenpipe_engine::vision_
(hash=6913338268963121281, trigger=visual_change) manager::manager: Starting event-driven capture for monitor
2026-05-07T21:20:57.170225Z INFO screenpipe_engine::event_d 2 (device: monitor_2)\n2026-05-08T09:25:46.472981Z INFO scr
riven_capture: content dedup: skipping capture for monitor 1 eenpipe_engine::vision_manager::manager: VisionManager start
(hash=6913338268963121281, trigger=click) ed with 2/2 monitor(s)\n2026-05-08T09:25:46.472989Z INFO sc
2026-05-07T21:21:07.150037Z INFO screenpipe_engine::event_d reenpipe_engine::vision_manager::monitor_watcher: Starting m
riven_capture: content dedup: skipping capture for monitor 1 onitor watcher (event-driven via CGDisplayRegisterReconfigur
(hash=6913338268963121281, trigger=click) ationCallback, 60s backstop poll)\n2026-05-08T09:25:46.47301
2026-05-07T21:21:07.320528Z INFO screenpipe_engine::event_d 7Z INFO screenpipe_engine::event_driven_capture: event-driv
riven_capture: content dedup: skipping capture for monitor 2 en capture started for monitor 2 (device: monitor_2)\n2026-0
(hash=6913338268963121281, trigger=click) 5-08T09:25:47.579143Z INFO sck_rs::stream_manager: persiste
2026-05-07T21:21:27.422746Z INFO screenpipe_engine::event_d nt SCK stream started for display 1 (1440x900, 2fps, 2 exclu
riven_capture: content dedup: skipping capture for monitor 2 ded)"}
(hash=6913338268963121281, trigger=visual_change)
2026-05-07T21:22:21.936188Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:22.033584Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=6913338268963121281, trigger=click)
2026-05-07T21:22:50.292905Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.735984Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:16.914206Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 2
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.420221Z INFO screenpipe_engine::event_d
riven_capture: content dedup: skipping capture for monitor 1
(hash=5795911359130326036, trigger=click)
2026-05-07T21:23:18.695513Z INFO screenpipe_engine::event_d ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14697
|
653
|
14
|
2026-05-10T18:14:05.195231+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436845195_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Adm1n@DXP4800PLUS-B5F8:~$
DOCKER
Close Tab
DEV (-z Adm1n@DXP4800PLUS-B5F8:~$
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
ssh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Adm1n@DXP4800PLUS-B5F8:~$","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"value":"Adm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-3904658384728484557
|
-8744695204205146327
|
visual_change
|
hybrid
|
NULL
|
Adm1n@DXP4800PLUS-B5F8:~$
DOCKER
Close Tab
DEV (-z Adm1n@DXP4800PLUS-B5F8:~$
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
ssh
iTerm2ShellEditViewSessionScripts•DOCKER• ₴1Adm1n@DXP4800PLUS-B5F8:~$DEV (-zsh)O 82ProfilesAPP (-zsh)WindowHelp• *3-zsh• x4ssh-zsh• 285lallscreenpipe"• ₴6Assh100% (47*8•87Sun 10 May 21:14:05-zshT81*8+...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14717
|
653
|
26
|
2026-05-10T18:15:20.718035+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-10/1778 /Users/lukas/.screenpipe/data/data/2026-05-10/1778436920718_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Adm1n@DXP4800PLUS-B5F8:~$
DOCKER
Close Tab
DEV (-z Adm1n@DXP4800PLUS-B5F8:~$
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
ssh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Adm1n@DXP4800PLUS-B5F8:~$","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"on_screen":true,"value":"Adm1n@DXP4800PLUS-B5F8:~$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-3904658384728484557
|
-8744695204205146327
|
visual_change
|
hybrid
|
NULL
|
Adm1n@DXP4800PLUS-B5F8:~$
DOCKER
Close Tab
DEV (-z Adm1n@DXP4800PLUS-B5F8:~$
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
ssh
Close Tab
-zsh
Close Tab
⌥⌘1
ssh
iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKER• ₴1Adm1n@DXP4800PLUS-B5F8:~$DEV (-zsh)O 82APP (-zsh)• *3-zsh• x4ssh-zsh• 285lihlscreenpipe"• ₴6Assh100% (47*8•87Sun 10 May 21:15:20-zshT81*8+...
|
NULL
|
NULL
|
NULL
|
NULL
|