|
713
|
16
|
66
|
2026-04-11T12:08:54.418635+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909334418_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1tokenize='unicode61'DEV (-zsh)• $2APP (-zsh)• *3-zsh• x4/* frames_fts(full_text,app_name, window_name,browser_url, id) */;CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, cO, c1, c2, с3, c4);CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER frames_ai AFTER INSERT ON framesWHEN NEW.full_text IS NOT NULL AND NEW.full_text != "'BEGININSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)VALUES (NEW.id,NEW.full_text,COALESCE(NEW.app_name,"'),COALESCE(NEW.window_name,COALESCECNEW.browser_url,-zsh• *5-zsh100% C47O ₴6Sat 11 Apr 15:08:54-zshT81X7);END;CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON framesBEGINDELETE FROM frames_fts WHERE id = OLD.id;INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)SELECTNEW.id,COALESCECNEW.full_text,"*),COALESCE(NEW.app_name,"*),COALESCE(NEW.window_name,"'),COALESCE(NEW.browser_url,"*)WHERE NEW.full_text IS NOT NULL AND NEW.full_text != "*;END;BEGINCREATE TRIGGER frames_ad AFTER DELETE ON framesDELETE FROM frames_fts WHERE id = OLD.id;END;CREATE INDEX idx_memories_frame_id ON memories(frame_id);CREATE INDEX idx_elements_source_role_textON elements(source, role, frame_id)WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
NULL
|
3295833833635013458
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1tokenize='unicode61'DEV (-zsh)• $2APP (-zsh)• *3-zsh• x4/* frames_fts(full_text,app_name, window_name,browser_url, id) */;CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, cO, c1, c2, с3, c4);CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER frames_ai AFTER INSERT ON framesWHEN NEW.full_text IS NOT NULL AND NEW.full_text != "'BEGININSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)VALUES (NEW.id,NEW.full_text,COALESCE(NEW.app_name,"'),COALESCE(NEW.window_name,COALESCECNEW.browser_url,-zsh• *5-zsh100% C47O ₴6Sat 11 Apr 15:08:54-zshT81X7);END;CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON framesBEGINDELETE FROM frames_fts WHERE id = OLD.id;INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)SELECTNEW.id,COALESCECNEW.full_text,"*),COALESCE(NEW.app_name,"*),COALESCE(NEW.window_name,"'),COALESCE(NEW.browser_url,"*)WHERE NEW.full_text IS NOT NULL AND NEW.full_text != "*;END;BEGINCREATE TRIGGER frames_ad AFTER DELETE ON framesDELETE FROM frames_fts WHERE id = OLD.id;END;CREATE INDEX idx_memories_frame_id ON memories(frame_id);CREATE INDEX idx_elements_source_role_textON elements(source, role, frame_id)WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
NULL
|
|
714
|
NULL
|
0
|
2026-04-11T12:08:55.143763+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909335143_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
zsh: command not found: #
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -o -name "*.sqlite" 2>/dev/null
/Users/lukas/.screenpipe/db.sqlite
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/
ls -lah ~/.screenpipe/data/ 2>/dev/null
zsh: command not found: s
total 0
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\ Support/ -name "*.db" -path "*screenpipe*" 2>/dev/null
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -path "*screenpipe*" 2>/dev/null
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E "\.db|\.sqlite"
screenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".tables"
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".schema"
CREATE TABLE _sqlx_migrations (
version BIGINT PRIMARY KEY,
description TEXT NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
success BOOLEAN NOT NULL,
checksum BLOB NOT NULL,
execution_time BIGINT NOT NULL
);
CREATE TABLE video_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE audio_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);
CREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE TABLE IF NOT EXISTS "ocr_text" (
frame_id INTEGER NOT NULL,
text TEXT NOT NULL,
text_json TEXT,
app_name TEXT NOT NULL DEFAULT '',
ocr_engine TEXT NOT NULL DEFAULT 'unknown'
, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);
CREATE TABLE tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE vision_tags (
vision_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (vision_id, tag_id),
FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE TABLE audio_tags (
audio_chunk_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (audio_chunk_id, tag_id),
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);
CREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);
CREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);
CREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);
CREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);
CREATE TABLE speakers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
metadata JSON
, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);
CREATE TABLE speaker_embeddings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
embedding FLOAT[512] NOT NULL
check(
typeof(embedding) == 'blob'
and vec_length(embedding) == 512
),
speaker_id INTEGER REFERENCES speakers(id)
);
CREATE TABLE IF NOT EXISTS "audio_transcriptions" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
audio_chunk_id INTEGER NOT NULL,
offset_index INTEGER NOT NULL,
timestamp TIMESTAMP NOT NULL,
transcription TEXT NOT NULL,
device TEXT NOT NULL DEFAULT '',
is_input_device BOOLEAN NOT NULL DEFAULT TRUE,
speaker_id INTEGER,
transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)
);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);
CREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);
CREATE INDEX idx_ocr_text_length ON ocr_text (text_length);
CREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);
CREATE TABLE ui_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
session_id TEXT,
relative_ms INTEGER NOT NULL DEFAULT 0,
event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard
-- Position
x INTEGER,
y INTEGER,
delta_x INTEGER,
delta_y INTEGER,
-- Mouse/key
button INTEGER,
click_count INTEGER,
key_code INTEGER,
modifiers INTEGER,
-- Text content
text_content TEXT,
text_length INTEGER,
-- App context
app_name TEXT,
app_pid INTEGER,
window_title TEXT,
browser_url TEXT,
-- Element context (from accessibility APIs)
element_role TEXT,
element_name TEXT,
element_value TEXT,
element_description TEXT,
element_automation_id TEXT,
element_bounds TEXT, -- JSON: {"x":0,"y":0,"width":100,"height":50}
-- Frame correlation
frame_id INTEGER,
-- Sync columns
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME
);
CREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX idx_ui_events_event_type ON ui_events(event_type);
CREATE INDEX idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX idx_ui_events_session_id ON ui_events(session_id);
CREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);
CREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);
CREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;
CREATE VIRTUAL TABLE ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
)
/* ui_events_fts(text_content,app_name,window_title,element_name) */;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
END;
CREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE UNIQUE INDEX idx_audio_transcription_chunk_text
ON audio_transcriptions(audio_chunk_id, transcription);
CREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);
CREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);
CREATE TABLE pipe_executions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pipe_name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'queued',
trigger_type TEXT NOT NULL DEFAULT 'manual',
pid INTEGER,
model TEXT,
provider TEXT,
started_at TEXT,
finished_at TEXT,
stdout TEXT DEFAULT '',
stderr TEXT DEFAULT '',
exit_code INTEGER,
error_type TEXT,
error_message TEXT,
duration_ms INTEGER
, session_path TEXT);
CREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);
CREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';
CREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);
CREATE TABLE pipe_scheduler_state (
pipe_name TEXT PRIMARY KEY,
last_run_at TEXT,
last_success_at TEXT,
consecutive_failures INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS "frames" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_chunk_id INTEGER DEFAULT NULL,
offset_index INTEGER NOT NULL DEFAULT 0,
timestamp TIMESTAMP NOT NULL,
name TEXT,
app_name TEXT DEFAULT NULL,
window_name TEXT DEFAULT NULL,
focused BOOLEAN DEFAULT NULL,
browser_url TEXT DEFAULT NULL,
device_name TEXT NOT NULL DEFAULT '',
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME,
-- New event-driven capture columns
snapshot_path TEXT DEFAULT NULL,
accessibility_text TEXT DEFAULT NULL,
accessibility_tree_json TEXT DEFAULT NULL,
content_hash INTEGER DEFAULT NULL,
simhash INTEGER DEFAULT NULL,
capture_trigger TEXT DEFAULT NULL,
text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,
FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)
);
CREATE INDEX idx_frames_timestamp ON frames(timestamp);
CREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX idx_frames_timestamp_device
ON frames(timestamp, device_name);
CREATE INDEX idx_frames_snapshot_path
ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;
CREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN
INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE TABLE meetings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
meeting_start TEXT NOT NULL,
meeting_end TEXT,
meeting_app TEXT NOT NULL,
title TEXT,
attendees TEXT,
detection_source TEXT NOT NULL DEFAULT 'app',
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, note TEXT);
CREATE INDEX idx_meetings_start ON meetings(meeting_start);
CREATE INDEX idx_meetings_end ON meetings(meeting_end);
CREATE TABLE elements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
frame_id INTEGER NOT NULL,
source TEXT NOT NULL, -- 'ocr' | 'accessibility'
role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'
-- AX: 'AXButton','AXTextField','AXStaticText', etc.
text TEXT, -- element text content (NULL for container nodes)
parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)
depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)
left_bound REAL, -- normalized 0-1 bounding box
top_bound REAL,
width_bound REAL,
height_bound REAL,
confidence REAL, -- OCR confidence (0-100), NULL for AX
sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent
FOREIGN KEY (frame_id) REFERENCES frames(id),
FOREIGN KEY (parent_id) REFERENCES elements(id)
);
CREATE INDEX idx_elements_frame_id ON elements(frame_id);
CREATE INDEX idx_elements_parent_id ON elements(parent_id);
CREATE INDEX idx_elements_source ON elements(source);
CREATE INDEX idx_elements_frame_source ON elements(frame_id, source);
CREATE VIRTUAL TABLE elements_fts USING fts5(
text,
role,
frame_id UNINDEXED,
content='elements',
content_rowid='id',
tokenize='unicode61'
)
/* elements_fts(text,role,frame_id) */;
CREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER elements_ai AFTER INSERT ON elements
WHEN NEW.text IS NOT NULL AND NEW.text != ''
BEGIN
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE TRIGGER elements_ad AFTER DELETE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
END;
CREATE TRIGGER elements_au AFTER UPDATE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(
transcription,
device,
speaker_id,
content='audio_transcriptions',
content_rowid='id',
tokenize='unicode61'
)
/* audio_transcriptions_fts(transcription,device,speaker_id) */;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions
WHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE INDEX idx_video_chunks_cloud_blob_id
ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;
CREATE INDEX idx_frames_cloud_blob_id
ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;
CREATE TABLE memories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
content TEXT NOT NULL,
source TEXT NOT NULL DEFAULT 'user',
source_context TEXT,
tags TEXT DEFAULT '[]',
importance REAL DEFAULT 0.5,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);
CREATE INDEX idx_memories_created_at ON memories(created_at);
CREATE INDEX idx_memories_importance ON memories(importance DESC);
CREATE INDEX idx_memories_source ON memories(source);
CREATE VIRTUAL TABLE memories_fts USING fts5(
content,
tags,
content='memories',
content_rowid='id',
tokenize='unicode61'
)
/* memories_fts(content,tags) */;
CREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER memories_ai AFTER INSERT ON memories
WHEN NEW.content IS NOT NULL AND NEW.content != ''
BEGIN
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));
END;
CREATE TRIGGER memories_ad AFTER DELETE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
END;
CREATE TRIGGER memories_au AFTER UPDATE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));
END;
CREATE VIRTUAL TABLE frames_fts USING fts5(
full_text,
app_name,
window_name,
browser_url,
id UNINDEXED,
tokenize='unicode61'
)
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nzsh: command not found: #\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -o -name \"*.sqlite\" 2>/dev/null \n/Users/lukas/.screenpipe/db.sqlite\n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/\nls -lah ~/.screenpipe/data/ 2>/dev/null\nzsh: command not found: s\ntotal 0\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\\ Support/ -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null \n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E \"\\.db|\\.sqlite\"\nscreenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".tables\"\n_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".schema\"\nCREATE TABLE _sqlx_migrations (\n version BIGINT PRIMARY KEY,\n description TEXT NOT NULL,\n installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n success BOOLEAN NOT NULL,\n checksum BLOB NOT NULL,\n execution_time BIGINT NOT NULL\n);\nCREATE TABLE video_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);\nCREATE TABLE sqlite_sequence(name,seq);\nCREATE TABLE audio_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);\nCREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE TABLE IF NOT EXISTS \"ocr_text\" (\n frame_id INTEGER NOT NULL,\n text TEXT NOT NULL,\n text_json TEXT,\n app_name TEXT NOT NULL DEFAULT '',\n ocr_engine TEXT NOT NULL DEFAULT 'unknown'\n, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);\nCREATE TABLE tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\nCREATE TABLE vision_tags (\n vision_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (vision_id, tag_id),\n FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE TABLE audio_tags (\n audio_chunk_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (audio_chunk_id, tag_id),\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);\nCREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);\nCREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);\nCREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);\nCREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);\nCREATE TABLE speakers (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT,\n metadata JSON\n, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);\nCREATE TABLE speaker_embeddings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n embedding FLOAT[512] NOT NULL\n check(\n typeof(embedding) == 'blob'\n and vec_length(embedding) == 512\n ),\n speaker_id INTEGER REFERENCES speakers(id)\n);\nCREATE TABLE IF NOT EXISTS \"audio_transcriptions\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n audio_chunk_id INTEGER NOT NULL,\n offset_index INTEGER NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n transcription TEXT NOT NULL,\n device TEXT NOT NULL DEFAULT '',\n is_input_device BOOLEAN NOT NULL DEFAULT TRUE,\n speaker_id INTEGER,\n transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)\n);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);\nCREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);\nCREATE INDEX idx_ocr_text_length ON ocr_text (text_length);\nCREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);\nCREATE TABLE ui_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n session_id TEXT,\n relative_ms INTEGER NOT NULL DEFAULT 0,\n event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard\n -- Position\n x INTEGER,\n y INTEGER,\n delta_x INTEGER,\n delta_y INTEGER,\n -- Mouse/key\n button INTEGER,\n click_count INTEGER,\n key_code INTEGER,\n modifiers INTEGER,\n -- Text content\n text_content TEXT,\n text_length INTEGER,\n -- App context\n app_name TEXT,\n app_pid INTEGER,\n window_title TEXT,\n browser_url TEXT,\n -- Element context (from accessibility APIs)\n element_role TEXT,\n element_name TEXT,\n element_value TEXT,\n element_description TEXT,\n element_automation_id TEXT,\n element_bounds TEXT, -- JSON: {\"x\":0,\"y\":0,\"width\":100,\"height\":50}\n -- Frame correlation\n frame_id INTEGER,\n -- Sync columns\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME\n);\nCREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX idx_ui_events_event_type ON ui_events(event_type);\nCREATE INDEX idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX idx_ui_events_session_id ON ui_events(session_id);\nCREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);\nCREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);\nCREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;\nCREATE VIRTUAL TABLE 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)\n/* ui_events_fts(text_content,app_name,window_title,element_name) */;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\nEND;\nCREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\n INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE UNIQUE INDEX idx_audio_transcription_chunk_text\nON audio_transcriptions(audio_chunk_id, transcription);\nCREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);\nCREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);\nCREATE TABLE pipe_executions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n pipe_name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n trigger_type TEXT NOT NULL DEFAULT 'manual',\n pid INTEGER,\n model TEXT,\n provider TEXT,\n started_at TEXT,\n finished_at TEXT,\n stdout TEXT DEFAULT '',\n stderr TEXT DEFAULT '',\n exit_code INTEGER,\n error_type TEXT,\n error_message TEXT,\n duration_ms INTEGER\n, session_path TEXT);\nCREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);\nCREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';\nCREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);\nCREATE TABLE pipe_scheduler_state (\n pipe_name TEXT PRIMARY KEY,\n last_run_at TEXT,\n last_success_at TEXT,\n consecutive_failures INTEGER DEFAULT 0\n);\nCREATE TABLE IF NOT EXISTS \"frames\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n video_chunk_id INTEGER DEFAULT NULL,\n offset_index INTEGER NOT NULL DEFAULT 0,\n timestamp TIMESTAMP NOT NULL,\n name TEXT,\n app_name TEXT DEFAULT NULL,\n window_name TEXT DEFAULT NULL,\n focused BOOLEAN DEFAULT NULL,\n browser_url TEXT DEFAULT NULL,\n device_name TEXT NOT NULL DEFAULT '',\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME,\n -- New event-driven capture columns\n snapshot_path TEXT DEFAULT NULL,\n accessibility_text TEXT DEFAULT NULL,\n accessibility_tree_json TEXT DEFAULT NULL,\n content_hash INTEGER DEFAULT NULL,\n simhash INTEGER DEFAULT NULL,\n capture_trigger TEXT DEFAULT NULL,\n text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,\n FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)\n);\nCREATE INDEX idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX idx_frames_timestamp_device\n ON frames(timestamp, device_name);\nCREATE INDEX idx_frames_snapshot_path\n ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;\nCREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN\n INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE TABLE meetings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n meeting_start TEXT NOT NULL,\n meeting_end TEXT,\n meeting_app TEXT NOT NULL,\n title TEXT,\n attendees TEXT,\n detection_source TEXT NOT NULL DEFAULT 'app',\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, note TEXT);\nCREATE INDEX idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX idx_meetings_end ON meetings(meeting_end);\nCREATE TABLE elements (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n frame_id INTEGER NOT NULL,\n source TEXT NOT NULL, -- 'ocr' | 'accessibility'\n role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'\n -- AX: 'AXButton','AXTextField','AXStaticText', etc.\n text TEXT, -- element text content (NULL for container nodes)\n parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)\n depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)\n left_bound REAL, -- normalized 0-1 bounding box\n top_bound REAL,\n width_bound REAL,\n height_bound REAL,\n confidence REAL, -- OCR confidence (0-100), NULL for AX\n sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent\n FOREIGN KEY (frame_id) REFERENCES frames(id),\n FOREIGN KEY (parent_id) REFERENCES elements(id)\n);\nCREATE INDEX idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX idx_elements_parent_id ON elements(parent_id);\nCREATE INDEX idx_elements_source ON elements(source);\nCREATE INDEX idx_elements_frame_source ON elements(frame_id, source);\nCREATE VIRTUAL TABLE elements_fts USING fts5(\n text,\n role,\n frame_id UNINDEXED,\n content='elements',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* elements_fts(text,role,frame_id) */;\nCREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER elements_ai AFTER INSERT ON elements\nWHEN NEW.text IS NOT NULL AND NEW.text != ''\nBEGIN\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE TRIGGER elements_ad AFTER DELETE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\nEND;\nCREATE TRIGGER elements_au AFTER UPDATE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(\n transcription,\n device,\n speaker_id,\n content='audio_transcriptions',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* audio_transcriptions_fts(transcription,device,speaker_id) */;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions\nWHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE INDEX idx_video_chunks_cloud_blob_id\n ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;\nCREATE INDEX idx_frames_cloud_blob_id\n ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;\nCREATE TABLE memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT 'user',\n source_context TEXT,\n tags TEXT DEFAULT '[]',\n importance REAL DEFAULT 0.5,\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);\nCREATE INDEX idx_memories_created_at ON memories(created_at);\nCREATE INDEX idx_memories_importance ON memories(importance DESC);\nCREATE INDEX idx_memories_source ON memories(source);\nCREATE VIRTUAL TABLE memories_fts USING fts5(\n content,\n tags,\n content='memories',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* memories_fts(content,tags) */;\nCREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER memories_ai AFTER INSERT ON memories\nWHEN NEW.content IS NOT NULL AND NEW.content != ''\nBEGIN\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));\nEND;\nCREATE TRIGGER memories_ad AFTER DELETE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\nEND;\nCREATE TRIGGER memories_au AFTER UPDATE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));\nEND;\nCREATE VIRTUAL TABLE frames_fts USING fts5(\n full_text,\n app_name,\n window_name,\n browser_url,\n id UNINDEXED,\n tokenize='unicode61'\n)\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":"drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nzsh: command not found: #\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -o -name \"*.sqlite\" 2>/dev/null \n/Users/lukas/.screenpipe/db.sqlite\n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/\nls -lah ~/.screenpipe/data/ 2>/dev/null\nzsh: command not found: s\ntotal 0\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\\ Support/ -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null \n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E \"\\.db|\\.sqlite\"\nscreenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".tables\"\n_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".schema\"\nCREATE TABLE _sqlx_migrations (\n version BIGINT PRIMARY KEY,\n description TEXT NOT NULL,\n installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n success BOOLEAN NOT NULL,\n checksum BLOB NOT NULL,\n execution_time BIGINT NOT NULL\n);\nCREATE TABLE video_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);\nCREATE TABLE sqlite_sequence(name,seq);\nCREATE TABLE audio_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);\nCREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE TABLE IF NOT EXISTS \"ocr_text\" (\n frame_id INTEGER NOT NULL,\n text TEXT NOT NULL,\n text_json TEXT,\n app_name TEXT NOT NULL DEFAULT '',\n ocr_engine TEXT NOT NULL DEFAULT 'unknown'\n, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);\nCREATE TABLE tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\nCREATE TABLE vision_tags (\n vision_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (vision_id, tag_id),\n FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE TABLE audio_tags (\n audio_chunk_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (audio_chunk_id, tag_id),\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);\nCREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);\nCREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);\nCREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);\nCREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);\nCREATE TABLE speakers (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT,\n metadata JSON\n, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);\nCREATE TABLE speaker_embeddings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n embedding FLOAT[512] NOT NULL\n check(\n typeof(embedding) == 'blob'\n and vec_length(embedding) == 512\n ),\n speaker_id INTEGER REFERENCES speakers(id)\n);\nCREATE TABLE IF NOT EXISTS \"audio_transcriptions\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n audio_chunk_id INTEGER NOT NULL,\n offset_index INTEGER NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n transcription TEXT NOT NULL,\n device TEXT NOT NULL DEFAULT '',\n is_input_device BOOLEAN NOT NULL DEFAULT TRUE,\n speaker_id INTEGER,\n transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)\n);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);\nCREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);\nCREATE INDEX idx_ocr_text_length ON ocr_text (text_length);\nCREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);\nCREATE TABLE ui_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n session_id TEXT,\n relative_ms INTEGER NOT NULL DEFAULT 0,\n event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard\n -- Position\n x INTEGER,\n y INTEGER,\n delta_x INTEGER,\n delta_y INTEGER,\n -- Mouse/key\n button INTEGER,\n click_count INTEGER,\n key_code INTEGER,\n modifiers INTEGER,\n -- Text content\n text_content TEXT,\n text_length INTEGER,\n -- App context\n app_name TEXT,\n app_pid INTEGER,\n window_title TEXT,\n browser_url TEXT,\n -- Element context (from accessibility APIs)\n element_role TEXT,\n element_name TEXT,\n element_value TEXT,\n element_description TEXT,\n element_automation_id TEXT,\n element_bounds TEXT, -- JSON: {\"x\":0,\"y\":0,\"width\":100,\"height\":50}\n -- Frame correlation\n frame_id INTEGER,\n -- Sync columns\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME\n);\nCREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX idx_ui_events_event_type ON ui_events(event_type);\nCREATE INDEX idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX idx_ui_events_session_id ON ui_events(session_id);\nCREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);\nCREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);\nCREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;\nCREATE VIRTUAL TABLE 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)\n/* ui_events_fts(text_content,app_name,window_title,element_name) */;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\nEND;\nCREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\n INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE UNIQUE INDEX idx_audio_transcription_chunk_text\nON audio_transcriptions(audio_chunk_id, transcription);\nCREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);\nCREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);\nCREATE TABLE pipe_executions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n pipe_name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n trigger_type TEXT NOT NULL DEFAULT 'manual',\n pid INTEGER,\n model TEXT,\n provider TEXT,\n started_at TEXT,\n finished_at TEXT,\n stdout TEXT DEFAULT '',\n stderr TEXT DEFAULT '',\n exit_code INTEGER,\n error_type TEXT,\n error_message TEXT,\n duration_ms INTEGER\n, session_path TEXT);\nCREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);\nCREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';\nCREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);\nCREATE TABLE pipe_scheduler_state (\n pipe_name TEXT PRIMARY KEY,\n last_run_at TEXT,\n last_success_at TEXT,\n consecutive_failures INTEGER DEFAULT 0\n);\nCREATE TABLE IF NOT EXISTS \"frames\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n video_chunk_id INTEGER DEFAULT NULL,\n offset_index INTEGER NOT NULL DEFAULT 0,\n timestamp TIMESTAMP NOT NULL,\n name TEXT,\n app_name TEXT DEFAULT NULL,\n window_name TEXT DEFAULT NULL,\n focused BOOLEAN DEFAULT NULL,\n browser_url TEXT DEFAULT NULL,\n device_name TEXT NOT NULL DEFAULT '',\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME,\n -- New event-driven capture columns\n snapshot_path TEXT DEFAULT NULL,\n accessibility_text TEXT DEFAULT NULL,\n accessibility_tree_json TEXT DEFAULT NULL,\n content_hash INTEGER DEFAULT NULL,\n simhash INTEGER DEFAULT NULL,\n capture_trigger TEXT DEFAULT NULL,\n text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,\n FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)\n);\nCREATE INDEX idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX idx_frames_timestamp_device\n ON frames(timestamp, device_name);\nCREATE INDEX idx_frames_snapshot_path\n ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;\nCREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN\n INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE TABLE meetings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n meeting_start TEXT NOT NULL,\n meeting_end TEXT,\n meeting_app TEXT NOT NULL,\n title TEXT,\n attendees TEXT,\n detection_source TEXT NOT NULL DEFAULT 'app',\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, note TEXT);\nCREATE INDEX idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX idx_meetings_end ON meetings(meeting_end);\nCREATE TABLE elements (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n frame_id INTEGER NOT NULL,\n source TEXT NOT NULL, -- 'ocr' | 'accessibility'\n role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'\n -- AX: 'AXButton','AXTextField','AXStaticText', etc.\n text TEXT, -- element text content (NULL for container nodes)\n parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)\n depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)\n left_bound REAL, -- normalized 0-1 bounding box\n top_bound REAL,\n width_bound REAL,\n height_bound REAL,\n confidence REAL, -- OCR confidence (0-100), NULL for AX\n sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent\n FOREIGN KEY (frame_id) REFERENCES frames(id),\n FOREIGN KEY (parent_id) REFERENCES elements(id)\n);\nCREATE INDEX idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX idx_elements_parent_id ON elements(parent_id);\nCREATE INDEX idx_elements_source ON elements(source);\nCREATE INDEX idx_elements_frame_source ON elements(frame_id, source);\nCREATE VIRTUAL TABLE elements_fts USING fts5(\n text,\n role,\n frame_id UNINDEXED,\n content='elements',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* elements_fts(text,role,frame_id) */;\nCREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER elements_ai AFTER INSERT ON elements\nWHEN NEW.text IS NOT NULL AND NEW.text != ''\nBEGIN\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE TRIGGER elements_ad AFTER DELETE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\nEND;\nCREATE TRIGGER elements_au AFTER UPDATE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(\n transcription,\n device,\n speaker_id,\n content='audio_transcriptions',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* audio_transcriptions_fts(transcription,device,speaker_id) */;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions\nWHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE INDEX idx_video_chunks_cloud_blob_id\n ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;\nCREATE INDEX idx_frames_cloud_blob_id\n ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;\nCREATE TABLE memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT 'user',\n source_context TEXT,\n tags TEXT DEFAULT '[]',\n importance REAL DEFAULT 0.5,\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);\nCREATE INDEX idx_memories_created_at ON memories(created_at);\nCREATE INDEX idx_memories_importance ON memories(importance DESC);\nCREATE INDEX idx_memories_source ON memories(source);\nCREATE VIRTUAL TABLE memories_fts USING fts5(\n content,\n tags,\n content='memories',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* memories_fts(content,tags) */;\nCREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER memories_ai AFTER INSERT ON memories\nWHEN NEW.content IS NOT NULL AND NEW.content != ''\nBEGIN\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));\nEND;\nCREATE TRIGGER memories_ad AFTER DELETE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\nEND;\nCREATE TRIGGER memories_au AFTER UPDATE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));\nEND;\nCREATE VIRTUAL TABLE frames_fts USING fts5(\n full_text,\n app_name,\n window_name,\n browser_url,\n id UNINDEXED,\n tokenize='unicode61'\n)\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
5853192385605379516
|
3173372984674339333
|
click
|
accessibility
|
NULL
|
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
zsh: command not found: #
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -o -name "*.sqlite" 2>/dev/null
/Users/lukas/.screenpipe/db.sqlite
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/
ls -lah ~/.screenpipe/data/ 2>/dev/null
zsh: command not found: s
total 0
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\ Support/ -name "*.db" -path "*screenpipe*" 2>/dev/null
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -path "*screenpipe*" 2>/dev/null
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E "\.db|\.sqlite"
screenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".tables"
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".schema"
CREATE TABLE _sqlx_migrations (
version BIGINT PRIMARY KEY,
description TEXT NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
success BOOLEAN NOT NULL,
checksum BLOB NOT NULL,
execution_time BIGINT NOT NULL
);
CREATE TABLE video_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE audio_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);
CREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE TABLE IF NOT EXISTS "ocr_text" (
frame_id INTEGER NOT NULL,
text TEXT NOT NULL,
text_json TEXT,
app_name TEXT NOT NULL DEFAULT '',
ocr_engine TEXT NOT NULL DEFAULT 'unknown'
, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);
CREATE TABLE tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE vision_tags (
vision_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (vision_id, tag_id),
FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE TABLE audio_tags (
audio_chunk_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (audio_chunk_id, tag_id),
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);
CREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);
CREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);
CREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);
CREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);
CREATE TABLE speakers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
metadata JSON
, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);
CREATE TABLE speaker_embeddings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
embedding FLOAT[512] NOT NULL
check(
typeof(embedding) == 'blob'
and vec_length(embedding) == 512
),
speaker_id INTEGER REFERENCES speakers(id)
);
CREATE TABLE IF NOT EXISTS "audio_transcriptions" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
audio_chunk_id INTEGER NOT NULL,
offset_index INTEGER NOT NULL,
timestamp TIMESTAMP NOT NULL,
transcription TEXT NOT NULL,
device TEXT NOT NULL DEFAULT '',
is_input_device BOOLEAN NOT NULL DEFAULT TRUE,
speaker_id INTEGER,
transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)
);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);
CREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);
CREATE INDEX idx_ocr_text_length ON ocr_text (text_length);
CREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);
CREATE TABLE ui_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
session_id TEXT,
relative_ms INTEGER NOT NULL DEFAULT 0,
event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard
-- Position
x INTEGER,
y INTEGER,
delta_x INTEGER,
delta_y INTEGER,
-- Mouse/key
button INTEGER,
click_count INTEGER,
key_code INTEGER,
modifiers INTEGER,
-- Text content
text_content TEXT,
text_length INTEGER,
-- App context
app_name TEXT,
app_pid INTEGER,
window_title TEXT,
browser_url TEXT,
-- Element context (from accessibility APIs)
element_role TEXT,
element_name TEXT,
element_value TEXT,
element_description TEXT,
element_automation_id TEXT,
element_bounds TEXT, -- JSON: {"x":0,"y":0,"width":100,"height":50}
-- Frame correlation
frame_id INTEGER,
-- Sync columns
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME
);
CREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX idx_ui_events_event_type ON ui_events(event_type);
CREATE INDEX idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX idx_ui_events_session_id ON ui_events(session_id);
CREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);
CREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);
CREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;
CREATE VIRTUAL TABLE ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
)
/* ui_events_fts(text_content,app_name,window_title,element_name) */;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
END;
CREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE UNIQUE INDEX idx_audio_transcription_chunk_text
ON audio_transcriptions(audio_chunk_id, transcription);
CREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);
CREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);
CREATE TABLE pipe_executions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pipe_name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'queued',
trigger_type TEXT NOT NULL DEFAULT 'manual',
pid INTEGER,
model TEXT,
provider TEXT,
started_at TEXT,
finished_at TEXT,
stdout TEXT DEFAULT '',
stderr TEXT DEFAULT '',
exit_code INTEGER,
error_type TEXT,
error_message TEXT,
duration_ms INTEGER
, session_path TEXT);
CREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);
CREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';
CREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);
CREATE TABLE pipe_scheduler_state (
pipe_name TEXT PRIMARY KEY,
last_run_at TEXT,
last_success_at TEXT,
consecutive_failures INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS "frames" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_chunk_id INTEGER DEFAULT NULL,
offset_index INTEGER NOT NULL DEFAULT 0,
timestamp TIMESTAMP NOT NULL,
name TEXT,
app_name TEXT DEFAULT NULL,
window_name TEXT DEFAULT NULL,
focused BOOLEAN DEFAULT NULL,
browser_url TEXT DEFAULT NULL,
device_name TEXT NOT NULL DEFAULT '',
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME,
-- New event-driven capture columns
snapshot_path TEXT DEFAULT NULL,
accessibility_text TEXT DEFAULT NULL,
accessibility_tree_json TEXT DEFAULT NULL,
content_hash INTEGER DEFAULT NULL,
simhash INTEGER DEFAULT NULL,
capture_trigger TEXT DEFAULT NULL,
text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,
FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)
);
CREATE INDEX idx_frames_timestamp ON frames(timestamp);
CREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX idx_frames_timestamp_device
ON frames(timestamp, device_name);
CREATE INDEX idx_frames_snapshot_path
ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;
CREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN
INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE TABLE meetings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
meeting_start TEXT NOT NULL,
meeting_end TEXT,
meeting_app TEXT NOT NULL,
title TEXT,
attendees TEXT,
detection_source TEXT NOT NULL DEFAULT 'app',
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, note TEXT);
CREATE INDEX idx_meetings_start ON meetings(meeting_start);
CREATE INDEX idx_meetings_end ON meetings(meeting_end);
CREATE TABLE elements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
frame_id INTEGER NOT NULL,
source TEXT NOT NULL, -- 'ocr' | 'accessibility'
role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'
-- AX: 'AXButton','AXTextField','AXStaticText', etc.
text TEXT, -- element text content (NULL for container nodes)
parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)
depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)
left_bound REAL, -- normalized 0-1 bounding box
top_bound REAL,
width_bound REAL,
height_bound REAL,
confidence REAL, -- OCR confidence (0-100), NULL for AX
sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent
FOREIGN KEY (frame_id) REFERENCES frames(id),
FOREIGN KEY (parent_id) REFERENCES elements(id)
);
CREATE INDEX idx_elements_frame_id ON elements(frame_id);
CREATE INDEX idx_elements_parent_id ON elements(parent_id);
CREATE INDEX idx_elements_source ON elements(source);
CREATE INDEX idx_elements_frame_source ON elements(frame_id, source);
CREATE VIRTUAL TABLE elements_fts USING fts5(
text,
role,
frame_id UNINDEXED,
content='elements',
content_rowid='id',
tokenize='unicode61'
)
/* elements_fts(text,role,frame_id) */;
CREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER elements_ai AFTER INSERT ON elements
WHEN NEW.text IS NOT NULL AND NEW.text != ''
BEGIN
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE TRIGGER elements_ad AFTER DELETE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
END;
CREATE TRIGGER elements_au AFTER UPDATE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(
transcription,
device,
speaker_id,
content='audio_transcriptions',
content_rowid='id',
tokenize='unicode61'
)
/* audio_transcriptions_fts(transcription,device,speaker_id) */;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions
WHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE INDEX idx_video_chunks_cloud_blob_id
ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;
CREATE INDEX idx_frames_cloud_blob_id
ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;
CREATE TABLE memories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
content TEXT NOT NULL,
source TEXT NOT NULL DEFAULT 'user',
source_context TEXT,
tags TEXT DEFAULT '[]',
importance REAL DEFAULT 0.5,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);
CREATE INDEX idx_memories_created_at ON memories(created_at);
CREATE INDEX idx_memories_importance ON memories(importance DESC);
CREATE INDEX idx_memories_source ON memories(source);
CREATE VIRTUAL TABLE memories_fts USING fts5(
content,
tags,
content='memories',
content_rowid='id',
tokenize='unicode61'
)
/* memories_fts(content,tags) */;
CREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER memories_ai AFTER INSERT ON memories
WHEN NEW.content IS NOT NULL AND NEW.content != ''
BEGIN
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));
END;
CREATE TRIGGER memories_ad AFTER DELETE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
END;
CREATE TRIGGER memories_au AFTER UPDATE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));
END;
CREATE VIRTUAL TABLE frames_fts USING fts5(
full_text,
app_name,
window_name,
browser_url,
id UNINDEXED,
tokenize='unicode61'
)
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
713
|
|
715
|
17
|
0
|
2026-04-11T12:09:26.746273+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909366746_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
zsh: command not found: #
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -o -name "*.sqlite" 2>/dev/null
/Users/lukas/.screenpipe/db.sqlite
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/
ls -lah ~/.screenpipe/data/ 2>/dev/null
zsh: command not found: s
total 0
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\ Support/ -name "*.db" -path "*screenpipe*" 2>/dev/null
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -path "*screenpipe*" 2>/dev/null
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E "\.db|\.sqlite"
screenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".tables"
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".schema"
CREATE TABLE _sqlx_migrations (
version BIGINT PRIMARY KEY,
description TEXT NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
success BOOLEAN NOT NULL,
checksum BLOB NOT NULL,
execution_time BIGINT NOT NULL
);
CREATE TABLE video_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE audio_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);
CREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE TABLE IF NOT EXISTS "ocr_text" (
frame_id INTEGER NOT NULL,
text TEXT NOT NULL,
text_json TEXT,
app_name TEXT NOT NULL DEFAULT '',
ocr_engine TEXT NOT NULL DEFAULT 'unknown'
, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);
CREATE TABLE tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE vision_tags (
vision_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (vision_id, tag_id),
FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE TABLE audio_tags (
audio_chunk_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (audio_chunk_id, tag_id),
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);
CREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);
CREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);
CREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);
CREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);
CREATE TABLE speakers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
metadata JSON
, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);
CREATE TABLE speaker_embeddings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
embedding FLOAT[512] NOT NULL
check(
typeof(embedding) == 'blob'
and vec_length(embedding) == 512
),
speaker_id INTEGER REFERENCES speakers(id)
);
CREATE TABLE IF NOT EXISTS "audio_transcriptions" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
audio_chunk_id INTEGER NOT NULL,
offset_index INTEGER NOT NULL,
timestamp TIMESTAMP NOT NULL,
transcription TEXT NOT NULL,
device TEXT NOT NULL DEFAULT '',
is_input_device BOOLEAN NOT NULL DEFAULT TRUE,
speaker_id INTEGER,
transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)
);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);
CREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);
CREATE INDEX idx_ocr_text_length ON ocr_text (text_length);
CREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);
CREATE TABLE ui_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
session_id TEXT,
relative_ms INTEGER NOT NULL DEFAULT 0,
event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard
-- Position
x INTEGER,
y INTEGER,
delta_x INTEGER,
delta_y INTEGER,
-- Mouse/key
button INTEGER,
click_count INTEGER,
key_code INTEGER,
modifiers INTEGER,
-- Text content
text_content TEXT,
text_length INTEGER,
-- App context
app_name TEXT,
app_pid INTEGER,
window_title TEXT,
browser_url TEXT,
-- Element context (from accessibility APIs)
element_role TEXT,
element_name TEXT,
element_value TEXT,
element_description TEXT,
element_automation_id TEXT,
element_bounds TEXT, -- JSON: {"x":0,"y":0,"width":100,"height":50}
-- Frame correlation
frame_id INTEGER,
-- Sync columns
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME
);
CREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX idx_ui_events_event_type ON ui_events(event_type);
CREATE INDEX idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX idx_ui_events_session_id ON ui_events(session_id);
CREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);
CREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);
CREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;
CREATE VIRTUAL TABLE ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
)
/* ui_events_fts(text_content,app_name,window_title,element_name) */;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
END;
CREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE UNIQUE INDEX idx_audio_transcription_chunk_text
ON audio_transcriptions(audio_chunk_id, transcription);
CREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);
CREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);
CREATE TABLE pipe_executions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pipe_name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'queued',
trigger_type TEXT NOT NULL DEFAULT 'manual',
pid INTEGER,
model TEXT,
provider TEXT,
started_at TEXT,
finished_at TEXT,
stdout TEXT DEFAULT '',
stderr TEXT DEFAULT '',
exit_code INTEGER,
error_type TEXT,
error_message TEXT,
duration_ms INTEGER
, session_path TEXT);
CREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);
CREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';
CREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);
CREATE TABLE pipe_scheduler_state (
pipe_name TEXT PRIMARY KEY,
last_run_at TEXT,
last_success_at TEXT,
consecutive_failures INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS "frames" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_chunk_id INTEGER DEFAULT NULL,
offset_index INTEGER NOT NULL DEFAULT 0,
timestamp TIMESTAMP NOT NULL,
name TEXT,
app_name TEXT DEFAULT NULL,
window_name TEXT DEFAULT NULL,
focused BOOLEAN DEFAULT NULL,
browser_url TEXT DEFAULT NULL,
device_name TEXT NOT NULL DEFAULT '',
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME,
-- New event-driven capture columns
snapshot_path TEXT DEFAULT NULL,
accessibility_text TEXT DEFAULT NULL,
accessibility_tree_json TEXT DEFAULT NULL,
content_hash INTEGER DEFAULT NULL,
simhash INTEGER DEFAULT NULL,
capture_trigger TEXT DEFAULT NULL,
text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,
FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)
);
CREATE INDEX idx_frames_timestamp ON frames(timestamp);
CREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX idx_frames_timestamp_device
ON frames(timestamp, device_name);
CREATE INDEX idx_frames_snapshot_path
ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;
CREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN
INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE TABLE meetings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
meeting_start TEXT NOT NULL,
meeting_end TEXT,
meeting_app TEXT NOT NULL,
title TEXT,
attendees TEXT,
detection_source TEXT NOT NULL DEFAULT 'app',
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, note TEXT);
CREATE INDEX idx_meetings_start ON meetings(meeting_start);
CREATE INDEX idx_meetings_end ON meetings(meeting_end);
CREATE TABLE elements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
frame_id INTEGER NOT NULL,
source TEXT NOT NULL, -- 'ocr' | 'accessibility'
role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'
-- AX: 'AXButton','AXTextField','AXStaticText', etc.
text TEXT, -- element text content (NULL for container nodes)
parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)
depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)
left_bound REAL, -- normalized 0-1 bounding box
top_bound REAL,
width_bound REAL,
height_bound REAL,
confidence REAL, -- OCR confidence (0-100), NULL for AX
sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent
FOREIGN KEY (frame_id) REFERENCES frames(id),
FOREIGN KEY (parent_id) REFERENCES elements(id)
);
CREATE INDEX idx_elements_frame_id ON elements(frame_id);
CREATE INDEX idx_elements_parent_id ON elements(parent_id);
CREATE INDEX idx_elements_source ON elements(source);
CREATE INDEX idx_elements_frame_source ON elements(frame_id, source);
CREATE VIRTUAL TABLE elements_fts USING fts5(
text,
role,
frame_id UNINDEXED,
content='elements',
content_rowid='id',
tokenize='unicode61'
)
/* elements_fts(text,role,frame_id) */;
CREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER elements_ai AFTER INSERT ON elements
WHEN NEW.text IS NOT NULL AND NEW.text != ''
BEGIN
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE TRIGGER elements_ad AFTER DELETE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
END;
CREATE TRIGGER elements_au AFTER UPDATE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(
transcription,
device,
speaker_id,
content='audio_transcriptions',
content_rowid='id',
tokenize='unicode61'
)
/* audio_transcriptions_fts(transcription,device,speaker_id) */;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions
WHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE INDEX idx_video_chunks_cloud_blob_id
ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;
CREATE INDEX idx_frames_cloud_blob_id
ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;
CREATE TABLE memories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
content TEXT NOT NULL,
source TEXT NOT NULL DEFAULT 'user',
source_context TEXT,
tags TEXT DEFAULT '[]',
importance REAL DEFAULT 0.5,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);
CREATE INDEX idx_memories_created_at ON memories(created_at);
CREATE INDEX idx_memories_importance ON memories(importance DESC);
CREATE INDEX idx_memories_source ON memories(source);
CREATE VIRTUAL TABLE memories_fts USING fts5(
content,
tags,
content='memories',
content_rowid='id',
tokenize='unicode61'
)
/* memories_fts(content,tags) */;
CREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER memories_ai AFTER INSERT ON memories
WHEN NEW.content IS NOT NULL AND NEW.content != ''
BEGIN
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));
END;
CREATE TRIGGER memories_ad AFTER DELETE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
END;
CREATE TRIGGER memories_au AFTER UPDATE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));
END;
CREATE VIRTUAL TABLE frames_fts USING fts5(
full_text,
app_name,
window_name,
browser_url,
id UNINDEXED,
tokenize='unicode61'
)
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nzsh: command not found: #\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -o -name \"*.sqlite\" 2>/dev/null \n/Users/lukas/.screenpipe/db.sqlite\n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/\nls -lah ~/.screenpipe/data/ 2>/dev/null\nzsh: command not found: s\ntotal 0\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\\ Support/ -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null \n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E \"\\.db|\\.sqlite\"\nscreenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".tables\"\n_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".schema\"\nCREATE TABLE _sqlx_migrations (\n version BIGINT PRIMARY KEY,\n description TEXT NOT NULL,\n installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n success BOOLEAN NOT NULL,\n checksum BLOB NOT NULL,\n execution_time BIGINT NOT NULL\n);\nCREATE TABLE video_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);\nCREATE TABLE sqlite_sequence(name,seq);\nCREATE TABLE audio_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);\nCREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE TABLE IF NOT EXISTS \"ocr_text\" (\n frame_id INTEGER NOT NULL,\n text TEXT NOT NULL,\n text_json TEXT,\n app_name TEXT NOT NULL DEFAULT '',\n ocr_engine TEXT NOT NULL DEFAULT 'unknown'\n, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);\nCREATE TABLE tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\nCREATE TABLE vision_tags (\n vision_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (vision_id, tag_id),\n FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE TABLE audio_tags (\n audio_chunk_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (audio_chunk_id, tag_id),\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);\nCREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);\nCREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);\nCREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);\nCREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);\nCREATE TABLE speakers (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT,\n metadata JSON\n, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);\nCREATE TABLE speaker_embeddings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n embedding FLOAT[512] NOT NULL\n check(\n typeof(embedding) == 'blob'\n and vec_length(embedding) == 512\n ),\n speaker_id INTEGER REFERENCES speakers(id)\n);\nCREATE TABLE IF NOT EXISTS \"audio_transcriptions\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n audio_chunk_id INTEGER NOT NULL,\n offset_index INTEGER NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n transcription TEXT NOT NULL,\n device TEXT NOT NULL DEFAULT '',\n is_input_device BOOLEAN NOT NULL DEFAULT TRUE,\n speaker_id INTEGER,\n transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)\n);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);\nCREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);\nCREATE INDEX idx_ocr_text_length ON ocr_text (text_length);\nCREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);\nCREATE TABLE ui_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n session_id TEXT,\n relative_ms INTEGER NOT NULL DEFAULT 0,\n event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard\n -- Position\n x INTEGER,\n y INTEGER,\n delta_x INTEGER,\n delta_y INTEGER,\n -- Mouse/key\n button INTEGER,\n click_count INTEGER,\n key_code INTEGER,\n modifiers INTEGER,\n -- Text content\n text_content TEXT,\n text_length INTEGER,\n -- App context\n app_name TEXT,\n app_pid INTEGER,\n window_title TEXT,\n browser_url TEXT,\n -- Element context (from accessibility APIs)\n element_role TEXT,\n element_name TEXT,\n element_value TEXT,\n element_description TEXT,\n element_automation_id TEXT,\n element_bounds TEXT, -- JSON: {\"x\":0,\"y\":0,\"width\":100,\"height\":50}\n -- Frame correlation\n frame_id INTEGER,\n -- Sync columns\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME\n);\nCREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX idx_ui_events_event_type ON ui_events(event_type);\nCREATE INDEX idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX idx_ui_events_session_id ON ui_events(session_id);\nCREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);\nCREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);\nCREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;\nCREATE VIRTUAL TABLE 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)\n/* ui_events_fts(text_content,app_name,window_title,element_name) */;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\nEND;\nCREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\n INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE UNIQUE INDEX idx_audio_transcription_chunk_text\nON audio_transcriptions(audio_chunk_id, transcription);\nCREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);\nCREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);\nCREATE TABLE pipe_executions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n pipe_name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n trigger_type TEXT NOT NULL DEFAULT 'manual',\n pid INTEGER,\n model TEXT,\n provider TEXT,\n started_at TEXT,\n finished_at TEXT,\n stdout TEXT DEFAULT '',\n stderr TEXT DEFAULT '',\n exit_code INTEGER,\n error_type TEXT,\n error_message TEXT,\n duration_ms INTEGER\n, session_path TEXT);\nCREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);\nCREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';\nCREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);\nCREATE TABLE pipe_scheduler_state (\n pipe_name TEXT PRIMARY KEY,\n last_run_at TEXT,\n last_success_at TEXT,\n consecutive_failures INTEGER DEFAULT 0\n);\nCREATE TABLE IF NOT EXISTS \"frames\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n video_chunk_id INTEGER DEFAULT NULL,\n offset_index INTEGER NOT NULL DEFAULT 0,\n timestamp TIMESTAMP NOT NULL,\n name TEXT,\n app_name TEXT DEFAULT NULL,\n window_name TEXT DEFAULT NULL,\n focused BOOLEAN DEFAULT NULL,\n browser_url TEXT DEFAULT NULL,\n device_name TEXT NOT NULL DEFAULT '',\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME,\n -- New event-driven capture columns\n snapshot_path TEXT DEFAULT NULL,\n accessibility_text TEXT DEFAULT NULL,\n accessibility_tree_json TEXT DEFAULT NULL,\n content_hash INTEGER DEFAULT NULL,\n simhash INTEGER DEFAULT NULL,\n capture_trigger TEXT DEFAULT NULL,\n text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,\n FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)\n);\nCREATE INDEX idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX idx_frames_timestamp_device\n ON frames(timestamp, device_name);\nCREATE INDEX idx_frames_snapshot_path\n ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;\nCREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN\n INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE TABLE meetings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n meeting_start TEXT NOT NULL,\n meeting_end TEXT,\n meeting_app TEXT NOT NULL,\n title TEXT,\n attendees TEXT,\n detection_source TEXT NOT NULL DEFAULT 'app',\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, note TEXT);\nCREATE INDEX idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX idx_meetings_end ON meetings(meeting_end);\nCREATE TABLE elements (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n frame_id INTEGER NOT NULL,\n source TEXT NOT NULL, -- 'ocr' | 'accessibility'\n role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'\n -- AX: 'AXButton','AXTextField','AXStaticText', etc.\n text TEXT, -- element text content (NULL for container nodes)\n parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)\n depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)\n left_bound REAL, -- normalized 0-1 bounding box\n top_bound REAL,\n width_bound REAL,\n height_bound REAL,\n confidence REAL, -- OCR confidence (0-100), NULL for AX\n sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent\n FOREIGN KEY (frame_id) REFERENCES frames(id),\n FOREIGN KEY (parent_id) REFERENCES elements(id)\n);\nCREATE INDEX idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX idx_elements_parent_id ON elements(parent_id);\nCREATE INDEX idx_elements_source ON elements(source);\nCREATE INDEX idx_elements_frame_source ON elements(frame_id, source);\nCREATE VIRTUAL TABLE elements_fts USING fts5(\n text,\n role,\n frame_id UNINDEXED,\n content='elements',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* elements_fts(text,role,frame_id) */;\nCREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER elements_ai AFTER INSERT ON elements\nWHEN NEW.text IS NOT NULL AND NEW.text != ''\nBEGIN\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE TRIGGER elements_ad AFTER DELETE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\nEND;\nCREATE TRIGGER elements_au AFTER UPDATE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(\n transcription,\n device,\n speaker_id,\n content='audio_transcriptions',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* audio_transcriptions_fts(transcription,device,speaker_id) */;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions\nWHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE INDEX idx_video_chunks_cloud_blob_id\n ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;\nCREATE INDEX idx_frames_cloud_blob_id\n ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;\nCREATE TABLE memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT 'user',\n source_context TEXT,\n tags TEXT DEFAULT '[]',\n importance REAL DEFAULT 0.5,\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);\nCREATE INDEX idx_memories_created_at ON memories(created_at);\nCREATE INDEX idx_memories_importance ON memories(importance DESC);\nCREATE INDEX idx_memories_source ON memories(source);\nCREATE VIRTUAL TABLE memories_fts USING fts5(\n content,\n tags,\n content='memories',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* memories_fts(content,tags) */;\nCREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER memories_ai AFTER INSERT ON memories\nWHEN NEW.content IS NOT NULL AND NEW.content != ''\nBEGIN\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));\nEND;\nCREATE TRIGGER memories_ad AFTER DELETE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\nEND;\nCREATE TRIGGER memories_au AFTER UPDATE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));\nEND;\nCREATE VIRTUAL TABLE frames_fts USING fts5(\n full_text,\n app_name,\n window_name,\n browser_url,\n id UNINDEXED,\n tokenize='unicode61'\n)\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":"drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nzsh: command not found: #\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -o -name \"*.sqlite\" 2>/dev/null \n/Users/lukas/.screenpipe/db.sqlite\n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/\nls -lah ~/.screenpipe/data/ 2>/dev/null\nzsh: command not found: s\ntotal 0\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\\ Support/ -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null \n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E \"\\.db|\\.sqlite\"\nscreenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".tables\"\n_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".schema\"\nCREATE TABLE _sqlx_migrations (\n version BIGINT PRIMARY KEY,\n description TEXT NOT NULL,\n installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n success BOOLEAN NOT NULL,\n checksum BLOB NOT NULL,\n execution_time BIGINT NOT NULL\n);\nCREATE TABLE video_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);\nCREATE TABLE sqlite_sequence(name,seq);\nCREATE TABLE audio_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);\nCREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE TABLE IF NOT EXISTS \"ocr_text\" (\n frame_id INTEGER NOT NULL,\n text TEXT NOT NULL,\n text_json TEXT,\n app_name TEXT NOT NULL DEFAULT '',\n ocr_engine TEXT NOT NULL DEFAULT 'unknown'\n, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);\nCREATE TABLE tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\nCREATE TABLE vision_tags (\n vision_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (vision_id, tag_id),\n FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE TABLE audio_tags (\n audio_chunk_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (audio_chunk_id, tag_id),\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);\nCREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);\nCREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);\nCREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);\nCREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);\nCREATE TABLE speakers (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT,\n metadata JSON\n, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);\nCREATE TABLE speaker_embeddings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n embedding FLOAT[512] NOT NULL\n check(\n typeof(embedding) == 'blob'\n and vec_length(embedding) == 512\n ),\n speaker_id INTEGER REFERENCES speakers(id)\n);\nCREATE TABLE IF NOT EXISTS \"audio_transcriptions\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n audio_chunk_id INTEGER NOT NULL,\n offset_index INTEGER NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n transcription TEXT NOT NULL,\n device TEXT NOT NULL DEFAULT '',\n is_input_device BOOLEAN NOT NULL DEFAULT TRUE,\n speaker_id INTEGER,\n transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)\n);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);\nCREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);\nCREATE INDEX idx_ocr_text_length ON ocr_text (text_length);\nCREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);\nCREATE TABLE ui_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n session_id TEXT,\n relative_ms INTEGER NOT NULL DEFAULT 0,\n event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard\n -- Position\n x INTEGER,\n y INTEGER,\n delta_x INTEGER,\n delta_y INTEGER,\n -- Mouse/key\n button INTEGER,\n click_count INTEGER,\n key_code INTEGER,\n modifiers INTEGER,\n -- Text content\n text_content TEXT,\n text_length INTEGER,\n -- App context\n app_name TEXT,\n app_pid INTEGER,\n window_title TEXT,\n browser_url TEXT,\n -- Element context (from accessibility APIs)\n element_role TEXT,\n element_name TEXT,\n element_value TEXT,\n element_description TEXT,\n element_automation_id TEXT,\n element_bounds TEXT, -- JSON: {\"x\":0,\"y\":0,\"width\":100,\"height\":50}\n -- Frame correlation\n frame_id INTEGER,\n -- Sync columns\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME\n);\nCREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX idx_ui_events_event_type ON ui_events(event_type);\nCREATE INDEX idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX idx_ui_events_session_id ON ui_events(session_id);\nCREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);\nCREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);\nCREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;\nCREATE VIRTUAL TABLE 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)\n/* ui_events_fts(text_content,app_name,window_title,element_name) */;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\nEND;\nCREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\n INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE UNIQUE INDEX idx_audio_transcription_chunk_text\nON audio_transcriptions(audio_chunk_id, transcription);\nCREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);\nCREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);\nCREATE TABLE pipe_executions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n pipe_name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n trigger_type TEXT NOT NULL DEFAULT 'manual',\n pid INTEGER,\n model TEXT,\n provider TEXT,\n started_at TEXT,\n finished_at TEXT,\n stdout TEXT DEFAULT '',\n stderr TEXT DEFAULT '',\n exit_code INTEGER,\n error_type TEXT,\n error_message TEXT,\n duration_ms INTEGER\n, session_path TEXT);\nCREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);\nCREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';\nCREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);\nCREATE TABLE pipe_scheduler_state (\n pipe_name TEXT PRIMARY KEY,\n last_run_at TEXT,\n last_success_at TEXT,\n consecutive_failures INTEGER DEFAULT 0\n);\nCREATE TABLE IF NOT EXISTS \"frames\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n video_chunk_id INTEGER DEFAULT NULL,\n offset_index INTEGER NOT NULL DEFAULT 0,\n timestamp TIMESTAMP NOT NULL,\n name TEXT,\n app_name TEXT DEFAULT NULL,\n window_name TEXT DEFAULT NULL,\n focused BOOLEAN DEFAULT NULL,\n browser_url TEXT DEFAULT NULL,\n device_name TEXT NOT NULL DEFAULT '',\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME,\n -- New event-driven capture columns\n snapshot_path TEXT DEFAULT NULL,\n accessibility_text TEXT DEFAULT NULL,\n accessibility_tree_json TEXT DEFAULT NULL,\n content_hash INTEGER DEFAULT NULL,\n simhash INTEGER DEFAULT NULL,\n capture_trigger TEXT DEFAULT NULL,\n text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,\n FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)\n);\nCREATE INDEX idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX idx_frames_timestamp_device\n ON frames(timestamp, device_name);\nCREATE INDEX idx_frames_snapshot_path\n ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;\nCREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN\n INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE TABLE meetings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n meeting_start TEXT NOT NULL,\n meeting_end TEXT,\n meeting_app TEXT NOT NULL,\n title TEXT,\n attendees TEXT,\n detection_source TEXT NOT NULL DEFAULT 'app',\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, note TEXT);\nCREATE INDEX idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX idx_meetings_end ON meetings(meeting_end);\nCREATE TABLE elements (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n frame_id INTEGER NOT NULL,\n source TEXT NOT NULL, -- 'ocr' | 'accessibility'\n role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'\n -- AX: 'AXButton','AXTextField','AXStaticText', etc.\n text TEXT, -- element text content (NULL for container nodes)\n parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)\n depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)\n left_bound REAL, -- normalized 0-1 bounding box\n top_bound REAL,\n width_bound REAL,\n height_bound REAL,\n confidence REAL, -- OCR confidence (0-100), NULL for AX\n sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent\n FOREIGN KEY (frame_id) REFERENCES frames(id),\n FOREIGN KEY (parent_id) REFERENCES elements(id)\n);\nCREATE INDEX idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX idx_elements_parent_id ON elements(parent_id);\nCREATE INDEX idx_elements_source ON elements(source);\nCREATE INDEX idx_elements_frame_source ON elements(frame_id, source);\nCREATE VIRTUAL TABLE elements_fts USING fts5(\n text,\n role,\n frame_id UNINDEXED,\n content='elements',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* elements_fts(text,role,frame_id) */;\nCREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER elements_ai AFTER INSERT ON elements\nWHEN NEW.text IS NOT NULL AND NEW.text != ''\nBEGIN\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE TRIGGER elements_ad AFTER DELETE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\nEND;\nCREATE TRIGGER elements_au AFTER UPDATE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(\n transcription,\n device,\n speaker_id,\n content='audio_transcriptions',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* audio_transcriptions_fts(transcription,device,speaker_id) */;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions\nWHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE INDEX idx_video_chunks_cloud_blob_id\n ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;\nCREATE INDEX idx_frames_cloud_blob_id\n ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;\nCREATE TABLE memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT 'user',\n source_context TEXT,\n tags TEXT DEFAULT '[]',\n importance REAL DEFAULT 0.5,\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);\nCREATE INDEX idx_memories_created_at ON memories(created_at);\nCREATE INDEX idx_memories_importance ON memories(importance DESC);\nCREATE INDEX idx_memories_source ON memories(source);\nCREATE VIRTUAL TABLE memories_fts USING fts5(\n content,\n tags,\n content='memories',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* memories_fts(content,tags) */;\nCREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER memories_ai AFTER INSERT ON memories\nWHEN NEW.content IS NOT NULL AND NEW.content != ''\nBEGIN\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));\nEND;\nCREATE TRIGGER memories_ad AFTER DELETE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\nEND;\nCREATE TRIGGER memories_au AFTER UPDATE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));\nEND;\nCREATE VIRTUAL TABLE frames_fts USING fts5(\n full_text,\n app_name,\n window_name,\n browser_url,\n id UNINDEXED,\n tokenize='unicode61'\n)\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
5853192385605379516
|
3173372984674339333
|
idle
|
accessibility
|
NULL
|
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
zsh: command not found: #
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -o -name "*.sqlite" 2>/dev/null
/Users/lukas/.screenpipe/db.sqlite
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/
ls -lah ~/.screenpipe/data/ 2>/dev/null
zsh: command not found: s
total 0
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\ Support/ -name "*.db" -path "*screenpipe*" 2>/dev/null
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -path "*screenpipe*" 2>/dev/null
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E "\.db|\.sqlite"
screenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".tables"
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".schema"
CREATE TABLE _sqlx_migrations (
version BIGINT PRIMARY KEY,
description TEXT NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
success BOOLEAN NOT NULL,
checksum BLOB NOT NULL,
execution_time BIGINT NOT NULL
);
CREATE TABLE video_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE audio_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);
CREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE TABLE IF NOT EXISTS "ocr_text" (
frame_id INTEGER NOT NULL,
text TEXT NOT NULL,
text_json TEXT,
app_name TEXT NOT NULL DEFAULT '',
ocr_engine TEXT NOT NULL DEFAULT 'unknown'
, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);
CREATE TABLE tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE vision_tags (
vision_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (vision_id, tag_id),
FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE TABLE audio_tags (
audio_chunk_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (audio_chunk_id, tag_id),
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);
CREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);
CREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);
CREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);
CREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);
CREATE TABLE speakers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
metadata JSON
, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);
CREATE TABLE speaker_embeddings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
embedding FLOAT[512] NOT NULL
check(
typeof(embedding) == 'blob'
and vec_length(embedding) == 512
),
speaker_id INTEGER REFERENCES speakers(id)
);
CREATE TABLE IF NOT EXISTS "audio_transcriptions" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
audio_chunk_id INTEGER NOT NULL,
offset_index INTEGER NOT NULL,
timestamp TIMESTAMP NOT NULL,
transcription TEXT NOT NULL,
device TEXT NOT NULL DEFAULT '',
is_input_device BOOLEAN NOT NULL DEFAULT TRUE,
speaker_id INTEGER,
transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)
);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);
CREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);
CREATE INDEX idx_ocr_text_length ON ocr_text (text_length);
CREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);
CREATE TABLE ui_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
session_id TEXT,
relative_ms INTEGER NOT NULL DEFAULT 0,
event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard
-- Position
x INTEGER,
y INTEGER,
delta_x INTEGER,
delta_y INTEGER,
-- Mouse/key
button INTEGER,
click_count INTEGER,
key_code INTEGER,
modifiers INTEGER,
-- Text content
text_content TEXT,
text_length INTEGER,
-- App context
app_name TEXT,
app_pid INTEGER,
window_title TEXT,
browser_url TEXT,
-- Element context (from accessibility APIs)
element_role TEXT,
element_name TEXT,
element_value TEXT,
element_description TEXT,
element_automation_id TEXT,
element_bounds TEXT, -- JSON: {"x":0,"y":0,"width":100,"height":50}
-- Frame correlation
frame_id INTEGER,
-- Sync columns
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME
);
CREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX idx_ui_events_event_type ON ui_events(event_type);
CREATE INDEX idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX idx_ui_events_session_id ON ui_events(session_id);
CREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);
CREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);
CREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;
CREATE VIRTUAL TABLE ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
)
/* ui_events_fts(text_content,app_name,window_title,element_name) */;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
END;
CREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE UNIQUE INDEX idx_audio_transcription_chunk_text
ON audio_transcriptions(audio_chunk_id, transcription);
CREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);
CREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);
CREATE TABLE pipe_executions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pipe_name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'queued',
trigger_type TEXT NOT NULL DEFAULT 'manual',
pid INTEGER,
model TEXT,
provider TEXT,
started_at TEXT,
finished_at TEXT,
stdout TEXT DEFAULT '',
stderr TEXT DEFAULT '',
exit_code INTEGER,
error_type TEXT,
error_message TEXT,
duration_ms INTEGER
, session_path TEXT);
CREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);
CREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';
CREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);
CREATE TABLE pipe_scheduler_state (
pipe_name TEXT PRIMARY KEY,
last_run_at TEXT,
last_success_at TEXT,
consecutive_failures INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS "frames" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_chunk_id INTEGER DEFAULT NULL,
offset_index INTEGER NOT NULL DEFAULT 0,
timestamp TIMESTAMP NOT NULL,
name TEXT,
app_name TEXT DEFAULT NULL,
window_name TEXT DEFAULT NULL,
focused BOOLEAN DEFAULT NULL,
browser_url TEXT DEFAULT NULL,
device_name TEXT NOT NULL DEFAULT '',
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME,
-- New event-driven capture columns
snapshot_path TEXT DEFAULT NULL,
accessibility_text TEXT DEFAULT NULL,
accessibility_tree_json TEXT DEFAULT NULL,
content_hash INTEGER DEFAULT NULL,
simhash INTEGER DEFAULT NULL,
capture_trigger TEXT DEFAULT NULL,
text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,
FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)
);
CREATE INDEX idx_frames_timestamp ON frames(timestamp);
CREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX idx_frames_timestamp_device
ON frames(timestamp, device_name);
CREATE INDEX idx_frames_snapshot_path
ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;
CREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN
INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE TABLE meetings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
meeting_start TEXT NOT NULL,
meeting_end TEXT,
meeting_app TEXT NOT NULL,
title TEXT,
attendees TEXT,
detection_source TEXT NOT NULL DEFAULT 'app',
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, note TEXT);
CREATE INDEX idx_meetings_start ON meetings(meeting_start);
CREATE INDEX idx_meetings_end ON meetings(meeting_end);
CREATE TABLE elements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
frame_id INTEGER NOT NULL,
source TEXT NOT NULL, -- 'ocr' | 'accessibility'
role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'
-- AX: 'AXButton','AXTextField','AXStaticText', etc.
text TEXT, -- element text content (NULL for container nodes)
parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)
depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)
left_bound REAL, -- normalized 0-1 bounding box
top_bound REAL,
width_bound REAL,
height_bound REAL,
confidence REAL, -- OCR confidence (0-100), NULL for AX
sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent
FOREIGN KEY (frame_id) REFERENCES frames(id),
FOREIGN KEY (parent_id) REFERENCES elements(id)
);
CREATE INDEX idx_elements_frame_id ON elements(frame_id);
CREATE INDEX idx_elements_parent_id ON elements(parent_id);
CREATE INDEX idx_elements_source ON elements(source);
CREATE INDEX idx_elements_frame_source ON elements(frame_id, source);
CREATE VIRTUAL TABLE elements_fts USING fts5(
text,
role,
frame_id UNINDEXED,
content='elements',
content_rowid='id',
tokenize='unicode61'
)
/* elements_fts(text,role,frame_id) */;
CREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER elements_ai AFTER INSERT ON elements
WHEN NEW.text IS NOT NULL AND NEW.text != ''
BEGIN
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE TRIGGER elements_ad AFTER DELETE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
END;
CREATE TRIGGER elements_au AFTER UPDATE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(
transcription,
device,
speaker_id,
content='audio_transcriptions',
content_rowid='id',
tokenize='unicode61'
)
/* audio_transcriptions_fts(transcription,device,speaker_id) */;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions
WHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE INDEX idx_video_chunks_cloud_blob_id
ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;
CREATE INDEX idx_frames_cloud_blob_id
ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;
CREATE TABLE memories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
content TEXT NOT NULL,
source TEXT NOT NULL DEFAULT 'user',
source_context TEXT,
tags TEXT DEFAULT '[]',
importance REAL DEFAULT 0.5,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);
CREATE INDEX idx_memories_created_at ON memories(created_at);
CREATE INDEX idx_memories_importance ON memories(importance DESC);
CREATE INDEX idx_memories_source ON memories(source);
CREATE VIRTUAL TABLE memories_fts USING fts5(
content,
tags,
content='memories',
content_rowid='id',
tokenize='unicode61'
)
/* memories_fts(content,tags) */;
CREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER memories_ai AFTER INSERT ON memories
WHEN NEW.content IS NOT NULL AND NEW.content != ''
BEGIN
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));
END;
CREATE TRIGGER memories_ad AFTER DELETE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
END;
CREATE TRIGGER memories_au AFTER UPDATE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));
END;
CREATE VIRTUAL TABLE frames_fts USING fts5(
full_text,
app_name,
window_name,
browser_url,
id UNINDEXED,
tokenize='unicode61'
)
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
716
|
17
|
1
|
2026-04-11T12:09:32.797426+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909372797_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEdit ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit ViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1tokenize='unicode61'DEV (-zsh)O $2APP (-zsh)• *3-zsh• 84/* frames_fts(full_text,app_name, window_name,browser_url, id) */;CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, CO, c1, c2, с3, с4);CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER frames_ai AFTER INSERT ON framesWHEN NEW.full_text IS NOT NULL AND NEW.full_text != "*BEGININSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)VALUES (NEW.id,NEW.full_text,COALESCE(NEW.app_name,"'),COALESCE(NEW.window_name,COALESCECNEW.browser_url,-zsh• *5-zsh100% <47O ₴6Sat 11 Apr 15:09:32-zshT81X7);END;CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON framesBEGINDELETE FROM frames_fts WHERE id = OLD.id;INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)SELECTNEW. id,COALESCECNEW.full_text,"*),COALESCE(NEW.app_name,"*),COALESCE(NEW.window_name,"'),COALESCE(NEW.browser_url,"*)WHERE NEW.full_text IS NOT NULL AND NEW.full_text != "*;END;BEGINCREATE TRIGGER frames_ad AFTER DELETE ON framesDELETE FROM frames_fts WHERE id = OLD.id;END;CREATE INDEX idx_memories_frame_id ON memories(frame_id);CREATE INDEX idx_elements_source_role_textON elements(source, role, frame_id)WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
NULL
|
3776369863370969961
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEdit ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit ViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1tokenize='unicode61'DEV (-zsh)O $2APP (-zsh)• *3-zsh• 84/* frames_fts(full_text,app_name, window_name,browser_url, id) */;CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, CO, c1, c2, с3, с4);CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER frames_ai AFTER INSERT ON framesWHEN NEW.full_text IS NOT NULL AND NEW.full_text != "*BEGININSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)VALUES (NEW.id,NEW.full_text,COALESCE(NEW.app_name,"'),COALESCE(NEW.window_name,COALESCECNEW.browser_url,-zsh• *5-zsh100% <47O ₴6Sat 11 Apr 15:09:32-zshT81X7);END;CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON framesBEGINDELETE FROM frames_fts WHERE id = OLD.id;INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)SELECTNEW. id,COALESCECNEW.full_text,"*),COALESCE(NEW.app_name,"*),COALESCE(NEW.window_name,"'),COALESCE(NEW.browser_url,"*)WHERE NEW.full_text IS NOT NULL AND NEW.full_text != "*;END;BEGINCREATE TRIGGER frames_ad AFTER DELETE ON framesDELETE FROM frames_fts WHERE id = OLD.id;END;CREATE INDEX idx_memories_frame_id ON memories(frame_id);CREATE INDEX idx_elements_source_role_textON elements(source, role, frame_id)WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
715
|
|
717
|
17
|
2
|
2026-04-11T12:09:33.439918+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909373439_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1tokenize='unicode61'DEV (-zsh)• $2APP (-zsh)• *3-zsh• x4/* frames_fts(full_text,app_name, window_name,browser_url, id) */;CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, cO, c1, c2, с3, c4);CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER frames_ai AFTER INSERT ON framesWHEN NEW.full_text IS NOT NULL AND NEW.full_text != "'BEGININSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)VALUES (NEW.id,NEW.full_text,COALESCE(NEW.app_name,"'),COALESCE(NEW.window_name,COALESCECNEW.browser_url,-zsh• x5-zsh100% C47O ₴6Sat 11 Apr 15:09:33-zshT81X7+);END;CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON framesBEGINDELETE FROM frames_fts WHERE id = OLD.id;INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)SELECTNEW.id,COALESCECNEW.full_text,"*),COALESCE(NEW.app_name,"*),COALESCE(NEW.window_name,"'),COALESCE(NEW.browser_url,"*)WHERE NEW.full_text IS NOT NULL AND NEW.full_text != "*;END;BEGINCREATE TRIGGER frames_ad AFTER DELETE ON framesDELETE FROM frames_fts WHERE id = OLD.id;END;CREATE INDEX idx_memories_frame_id ON memories(frame_id);CREATE INDEX idx_elements_source_role_textON elements(source, role, frame_id)WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
NULL
|
-3171887111164154172
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1tokenize='unicode61'DEV (-zsh)• $2APP (-zsh)• *3-zsh• x4/* frames_fts(full_text,app_name, window_name,browser_url, id) */;CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, cO, c1, c2, с3, c4);CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER frames_ai AFTER INSERT ON framesWHEN NEW.full_text IS NOT NULL AND NEW.full_text != "'BEGININSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)VALUES (NEW.id,NEW.full_text,COALESCE(NEW.app_name,"'),COALESCE(NEW.window_name,COALESCECNEW.browser_url,-zsh• x5-zsh100% C47O ₴6Sat 11 Apr 15:09:33-zshT81X7+);END;CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON framesBEGINDELETE FROM frames_fts WHERE id = OLD.id;INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)SELECTNEW.id,COALESCECNEW.full_text,"*),COALESCE(NEW.app_name,"*),COALESCE(NEW.window_name,"'),COALESCE(NEW.browser_url,"*)WHERE NEW.full_text IS NOT NULL AND NEW.full_text != "*;END;BEGINCREATE TRIGGER frames_ad AFTER DELETE ON framesDELETE FROM frames_fts WHERE id = OLD.id;END;CREATE INDEX idx_memories_frame_id ON memories(frame_id);CREATE INDEX idx_elements_source_role_textON elements(source, role, frame_id)WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
NULL
|
|
718
|
17
|
3
|
2026-04-11T12:09:34.648071+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909374648_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1tokenize='unicode61'DEV (-zsh)• $2APP (-zsh)• *3-zsh• x4/* frames_fts(full_text,app_name, window_name,browser_url, id) */;CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, cO, c1, c2, с3, c4);CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER frames_ai AFTER INSERT ON framesWHEN NEW.full_text IS NOT NULL AND NEW.full_text != "'BEGININSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)VALUES (NEW.id,NEW.full_text,COALESCE(NEW.app_name,"'),COALESCE(NEW.window_name,COALESCECNEW.browser_url,-zsh• x5-zsh100% C47O ₴6Sat 11 Apr 15:09:34-zshT81X7);END;CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON framesBEGINDELETE FROM frames_fts WHERE id = OLD.id;INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)SELECTNEW.id,COALESCECNEW.full_text,"*),COALESCE(NEW.app_name,"*),COALESCE(NEW.window_name,"'),COALESCE(NEW.browser_url,"*)WHERE NEW.full_text IS NOT NULL AND NEW.full_text != "*;END;BEGINCREATE TRIGGER frames_ad AFTER DELETE ON framesDELETE FROM frames_fts WHERE id = OLD.id;END;CREATE INDEX idx_memories_frame_id ON memories(frame_id);CREATE INDEX idx_elements_source_role_textON elements(source, role, frame_id)WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
NULL
|
-7498872109541583616
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1tokenize='unicode61'DEV (-zsh)• $2APP (-zsh)• *3-zsh• x4/* frames_fts(full_text,app_name, window_name,browser_url, id) */;CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, cO, c1, c2, с3, c4);CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;CREATE TRIGGER frames_ai AFTER INSERT ON framesWHEN NEW.full_text IS NOT NULL AND NEW.full_text != "'BEGININSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)VALUES (NEW.id,NEW.full_text,COALESCE(NEW.app_name,"'),COALESCE(NEW.window_name,COALESCECNEW.browser_url,-zsh• x5-zsh100% C47O ₴6Sat 11 Apr 15:09:34-zshT81X7);END;CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON framesBEGINDELETE FROM frames_fts WHERE id = OLD.id;INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)SELECTNEW.id,COALESCECNEW.full_text,"*),COALESCE(NEW.app_name,"*),COALESCE(NEW.window_name,"'),COALESCE(NEW.browser_url,"*)WHERE NEW.full_text IS NOT NULL AND NEW.full_text != "*;END;BEGINCREATE TRIGGER frames_ad AFTER DELETE ON framesDELETE FROM frames_fts WHERE id = OLD.id;END;CREATE INDEX idx_memories_frame_id ON memories(frame_id);CREATE INDEX idx_elements_source_role_textON elements(source, role, frame_id)WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $...
|
717
|
|
719
|
17
|
4
|
2026-04-11T12:09:36.183080+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909376183_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
zsh: command not found: #
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -o -name "*.sqlite" 2>/dev/null
/Users/lukas/.screenpipe/db.sqlite
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/
ls -lah ~/.screenpipe/data/ 2>/dev/null
zsh: command not found: s
total 0
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\ Support/ -name "*.db" -path "*screenpipe*" 2>/dev/null
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -path "*screenpipe*" 2>/dev/null
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E "\.db|\.sqlite"
screenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".tables"
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".schema"
CREATE TABLE _sqlx_migrations (
version BIGINT PRIMARY KEY,
description TEXT NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
success BOOLEAN NOT NULL,
checksum BLOB NOT NULL,
execution_time BIGINT NOT NULL
);
CREATE TABLE video_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE audio_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);
CREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE TABLE IF NOT EXISTS "ocr_text" (
frame_id INTEGER NOT NULL,
text TEXT NOT NULL,
text_json TEXT,
app_name TEXT NOT NULL DEFAULT '',
ocr_engine TEXT NOT NULL DEFAULT 'unknown'
, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);
CREATE TABLE tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE vision_tags (
vision_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (vision_id, tag_id),
FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE TABLE audio_tags (
audio_chunk_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (audio_chunk_id, tag_id),
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);
CREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);
CREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);
CREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);
CREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);
CREATE TABLE speakers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
metadata JSON
, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);
CREATE TABLE speaker_embeddings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
embedding FLOAT[512] NOT NULL
check(
typeof(embedding) == 'blob'
and vec_length(embedding) == 512
),
speaker_id INTEGER REFERENCES speakers(id)
);
CREATE TABLE IF NOT EXISTS "audio_transcriptions" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
audio_chunk_id INTEGER NOT NULL,
offset_index INTEGER NOT NULL,
timestamp TIMESTAMP NOT NULL,
transcription TEXT NOT NULL,
device TEXT NOT NULL DEFAULT '',
is_input_device BOOLEAN NOT NULL DEFAULT TRUE,
speaker_id INTEGER,
transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)
);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);
CREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);
CREATE INDEX idx_ocr_text_length ON ocr_text (text_length);
CREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);
CREATE TABLE ui_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
session_id TEXT,
relative_ms INTEGER NOT NULL DEFAULT 0,
event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard
-- Position
x INTEGER,
y INTEGER,
delta_x INTEGER,
delta_y INTEGER,
-- Mouse/key
button INTEGER,
click_count INTEGER,
key_code INTEGER,
modifiers INTEGER,
-- Text content
text_content TEXT,
text_length INTEGER,
-- App context
app_name TEXT,
app_pid INTEGER,
window_title TEXT,
browser_url TEXT,
-- Element context (from accessibility APIs)
element_role TEXT,
element_name TEXT,
element_value TEXT,
element_description TEXT,
element_automation_id TEXT,
element_bounds TEXT, -- JSON: {"x":0,"y":0,"width":100,"height":50}
-- Frame correlation
frame_id INTEGER,
-- Sync columns
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME
);
CREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX idx_ui_events_event_type ON ui_events(event_type);
CREATE INDEX idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX idx_ui_events_session_id ON ui_events(session_id);
CREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);
CREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);
CREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;
CREATE VIRTUAL TABLE ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
)
/* ui_events_fts(text_content,app_name,window_title,element_name) */;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
END;
CREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE UNIQUE INDEX idx_audio_transcription_chunk_text
ON audio_transcriptions(audio_chunk_id, transcription);
CREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);
CREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);
CREATE TABLE pipe_executions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pipe_name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'queued',
trigger_type TEXT NOT NULL DEFAULT 'manual',
pid INTEGER,
model TEXT,
provider TEXT,
started_at TEXT,
finished_at TEXT,
stdout TEXT DEFAULT '',
stderr TEXT DEFAULT '',
exit_code INTEGER,
error_type TEXT,
error_message TEXT,
duration_ms INTEGER
, session_path TEXT);
CREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);
CREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';
CREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);
CREATE TABLE pipe_scheduler_state (
pipe_name TEXT PRIMARY KEY,
last_run_at TEXT,
last_success_at TEXT,
consecutive_failures INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS "frames" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_chunk_id INTEGER DEFAULT NULL,
offset_index INTEGER NOT NULL DEFAULT 0,
timestamp TIMESTAMP NOT NULL,
name TEXT,
app_name TEXT DEFAULT NULL,
window_name TEXT DEFAULT NULL,
focused BOOLEAN DEFAULT NULL,
browser_url TEXT DEFAULT NULL,
device_name TEXT NOT NULL DEFAULT '',
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME,
-- New event-driven capture columns
snapshot_path TEXT DEFAULT NULL,
accessibility_text TEXT DEFAULT NULL,
accessibility_tree_json TEXT DEFAULT NULL,
content_hash INTEGER DEFAULT NULL,
simhash INTEGER DEFAULT NULL,
capture_trigger TEXT DEFAULT NULL,
text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,
FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)
);
CREATE INDEX idx_frames_timestamp ON frames(timestamp);
CREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX idx_frames_timestamp_device
ON frames(timestamp, device_name);
CREATE INDEX idx_frames_snapshot_path
ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;
CREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN
INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE TABLE meetings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
meeting_start TEXT NOT NULL,
meeting_end TEXT,
meeting_app TEXT NOT NULL,
title TEXT,
attendees TEXT,
detection_source TEXT NOT NULL DEFAULT 'app',
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, note TEXT);
CREATE INDEX idx_meetings_start ON meetings(meeting_start);
CREATE INDEX idx_meetings_end ON meetings(meeting_end);
CREATE TABLE elements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
frame_id INTEGER NOT NULL,
source TEXT NOT NULL, -- 'ocr' | 'accessibility'
role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'
-- AX: 'AXButton','AXTextField','AXStaticText', etc.
text TEXT, -- element text content (NULL for container nodes)
parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)
depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)
left_bound REAL, -- normalized 0-1 bounding box
top_bound REAL,
width_bound REAL,
height_bound REAL,
confidence REAL, -- OCR confidence (0-100), NULL for AX
sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent
FOREIGN KEY (frame_id) REFERENCES frames(id),
FOREIGN KEY (parent_id) REFERENCES elements(id)
);
CREATE INDEX idx_elements_frame_id ON elements(frame_id);
CREATE INDEX idx_elements_parent_id ON elements(parent_id);
CREATE INDEX idx_elements_source ON elements(source);
CREATE INDEX idx_elements_frame_source ON elements(frame_id, source);
CREATE VIRTUAL TABLE elements_fts USING fts5(
text,
role,
frame_id UNINDEXED,
content='elements',
content_rowid='id',
tokenize='unicode61'
)
/* elements_fts(text,role,frame_id) */;
CREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER elements_ai AFTER INSERT ON elements
WHEN NEW.text IS NOT NULL AND NEW.text != ''
BEGIN
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE TRIGGER elements_ad AFTER DELETE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
END;
CREATE TRIGGER elements_au AFTER UPDATE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(
transcription,
device,
speaker_id,
content='audio_transcriptions',
content_rowid='id',
tokenize='unicode61'
)
/* audio_transcriptions_fts(transcription,device,speaker_id) */;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions
WHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE INDEX idx_video_chunks_cloud_blob_id
ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;
CREATE INDEX idx_frames_cloud_blob_id
ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;
CREATE TABLE memories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
content TEXT NOT NULL,
source TEXT NOT NULL DEFAULT 'user',
source_context TEXT,
tags TEXT DEFAULT '[]',
importance REAL DEFAULT 0.5,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);
CREATE INDEX idx_memories_created_at ON memories(created_at);
CREATE INDEX idx_memories_importance ON memories(importance DESC);
CREATE INDEX idx_memories_source ON memories(source);
CREATE VIRTUAL TABLE memories_fts USING fts5(
content,
tags,
content='memories',
content_rowid='id',
tokenize='unicode61'
)
/* memories_fts(content,tags) */;
CREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER memories_ai AFTER INSERT ON memories
WHEN NEW.content IS NOT NULL AND NEW.content != ''
BEGIN
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));
END;
CREATE TRIGGER memories_ad AFTER DELETE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
END;
CREATE TRIGGER memories_au AFTER UPDATE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));
END;
CREATE VIRTUAL TABLE frames_fts USING fts5(
full_text,
app_name,
window_name,
browser_url,
id UNINDEXED,
tokenize='unicode61'
)
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nzsh: command not found: #\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -o -name \"*.sqlite\" 2>/dev/null \n/Users/lukas/.screenpipe/db.sqlite\n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/\nls -lah ~/.screenpipe/data/ 2>/dev/null\nzsh: command not found: s\ntotal 0\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\\ Support/ -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null \n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E \"\\.db|\\.sqlite\"\nscreenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".tables\"\n_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".schema\"\nCREATE TABLE _sqlx_migrations (\n version BIGINT PRIMARY KEY,\n description TEXT NOT NULL,\n installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n success BOOLEAN NOT NULL,\n checksum BLOB NOT NULL,\n execution_time BIGINT NOT NULL\n);\nCREATE TABLE video_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);\nCREATE TABLE sqlite_sequence(name,seq);\nCREATE TABLE audio_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);\nCREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE TABLE IF NOT EXISTS \"ocr_text\" (\n frame_id INTEGER NOT NULL,\n text TEXT NOT NULL,\n text_json TEXT,\n app_name TEXT NOT NULL DEFAULT '',\n ocr_engine TEXT NOT NULL DEFAULT 'unknown'\n, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);\nCREATE TABLE tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\nCREATE TABLE vision_tags (\n vision_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (vision_id, tag_id),\n FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE TABLE audio_tags (\n audio_chunk_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (audio_chunk_id, tag_id),\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);\nCREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);\nCREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);\nCREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);\nCREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);\nCREATE TABLE speakers (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT,\n metadata JSON\n, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);\nCREATE TABLE speaker_embeddings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n embedding FLOAT[512] NOT NULL\n check(\n typeof(embedding) == 'blob'\n and vec_length(embedding) == 512\n ),\n speaker_id INTEGER REFERENCES speakers(id)\n);\nCREATE TABLE IF NOT EXISTS \"audio_transcriptions\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n audio_chunk_id INTEGER NOT NULL,\n offset_index INTEGER NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n transcription TEXT NOT NULL,\n device TEXT NOT NULL DEFAULT '',\n is_input_device BOOLEAN NOT NULL DEFAULT TRUE,\n speaker_id INTEGER,\n transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)\n);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);\nCREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);\nCREATE INDEX idx_ocr_text_length ON ocr_text (text_length);\nCREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);\nCREATE TABLE ui_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n session_id TEXT,\n relative_ms INTEGER NOT NULL DEFAULT 0,\n event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard\n -- Position\n x INTEGER,\n y INTEGER,\n delta_x INTEGER,\n delta_y INTEGER,\n -- Mouse/key\n button INTEGER,\n click_count INTEGER,\n key_code INTEGER,\n modifiers INTEGER,\n -- Text content\n text_content TEXT,\n text_length INTEGER,\n -- App context\n app_name TEXT,\n app_pid INTEGER,\n window_title TEXT,\n browser_url TEXT,\n -- Element context (from accessibility APIs)\n element_role TEXT,\n element_name TEXT,\n element_value TEXT,\n element_description TEXT,\n element_automation_id TEXT,\n element_bounds TEXT, -- JSON: {\"x\":0,\"y\":0,\"width\":100,\"height\":50}\n -- Frame correlation\n frame_id INTEGER,\n -- Sync columns\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME\n);\nCREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX idx_ui_events_event_type ON ui_events(event_type);\nCREATE INDEX idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX idx_ui_events_session_id ON ui_events(session_id);\nCREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);\nCREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);\nCREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;\nCREATE VIRTUAL TABLE 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)\n/* ui_events_fts(text_content,app_name,window_title,element_name) */;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\nEND;\nCREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\n INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE UNIQUE INDEX idx_audio_transcription_chunk_text\nON audio_transcriptions(audio_chunk_id, transcription);\nCREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);\nCREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);\nCREATE TABLE pipe_executions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n pipe_name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n trigger_type TEXT NOT NULL DEFAULT 'manual',\n pid INTEGER,\n model TEXT,\n provider TEXT,\n started_at TEXT,\n finished_at TEXT,\n stdout TEXT DEFAULT '',\n stderr TEXT DEFAULT '',\n exit_code INTEGER,\n error_type TEXT,\n error_message TEXT,\n duration_ms INTEGER\n, session_path TEXT);\nCREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);\nCREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';\nCREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);\nCREATE TABLE pipe_scheduler_state (\n pipe_name TEXT PRIMARY KEY,\n last_run_at TEXT,\n last_success_at TEXT,\n consecutive_failures INTEGER DEFAULT 0\n);\nCREATE TABLE IF NOT EXISTS \"frames\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n video_chunk_id INTEGER DEFAULT NULL,\n offset_index INTEGER NOT NULL DEFAULT 0,\n timestamp TIMESTAMP NOT NULL,\n name TEXT,\n app_name TEXT DEFAULT NULL,\n window_name TEXT DEFAULT NULL,\n focused BOOLEAN DEFAULT NULL,\n browser_url TEXT DEFAULT NULL,\n device_name TEXT NOT NULL DEFAULT '',\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME,\n -- New event-driven capture columns\n snapshot_path TEXT DEFAULT NULL,\n accessibility_text TEXT DEFAULT NULL,\n accessibility_tree_json TEXT DEFAULT NULL,\n content_hash INTEGER DEFAULT NULL,\n simhash INTEGER DEFAULT NULL,\n capture_trigger TEXT DEFAULT NULL,\n text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,\n FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)\n);\nCREATE INDEX idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX idx_frames_timestamp_device\n ON frames(timestamp, device_name);\nCREATE INDEX idx_frames_snapshot_path\n ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;\nCREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN\n INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE TABLE meetings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n meeting_start TEXT NOT NULL,\n meeting_end TEXT,\n meeting_app TEXT NOT NULL,\n title TEXT,\n attendees TEXT,\n detection_source TEXT NOT NULL DEFAULT 'app',\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, note TEXT);\nCREATE INDEX idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX idx_meetings_end ON meetings(meeting_end);\nCREATE TABLE elements (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n frame_id INTEGER NOT NULL,\n source TEXT NOT NULL, -- 'ocr' | 'accessibility'\n role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'\n -- AX: 'AXButton','AXTextField','AXStaticText', etc.\n text TEXT, -- element text content (NULL for container nodes)\n parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)\n depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)\n left_bound REAL, -- normalized 0-1 bounding box\n top_bound REAL,\n width_bound REAL,\n height_bound REAL,\n confidence REAL, -- OCR confidence (0-100), NULL for AX\n sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent\n FOREIGN KEY (frame_id) REFERENCES frames(id),\n FOREIGN KEY (parent_id) REFERENCES elements(id)\n);\nCREATE INDEX idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX idx_elements_parent_id ON elements(parent_id);\nCREATE INDEX idx_elements_source ON elements(source);\nCREATE INDEX idx_elements_frame_source ON elements(frame_id, source);\nCREATE VIRTUAL TABLE elements_fts USING fts5(\n text,\n role,\n frame_id UNINDEXED,\n content='elements',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* elements_fts(text,role,frame_id) */;\nCREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER elements_ai AFTER INSERT ON elements\nWHEN NEW.text IS NOT NULL AND NEW.text != ''\nBEGIN\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE TRIGGER elements_ad AFTER DELETE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\nEND;\nCREATE TRIGGER elements_au AFTER UPDATE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(\n transcription,\n device,\n speaker_id,\n content='audio_transcriptions',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* audio_transcriptions_fts(transcription,device,speaker_id) */;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions\nWHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE INDEX idx_video_chunks_cloud_blob_id\n ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;\nCREATE INDEX idx_frames_cloud_blob_id\n ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;\nCREATE TABLE memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT 'user',\n source_context TEXT,\n tags TEXT DEFAULT '[]',\n importance REAL DEFAULT 0.5,\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);\nCREATE INDEX idx_memories_created_at ON memories(created_at);\nCREATE INDEX idx_memories_importance ON memories(importance DESC);\nCREATE INDEX idx_memories_source ON memories(source);\nCREATE VIRTUAL TABLE memories_fts USING fts5(\n content,\n tags,\n content='memories',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* memories_fts(content,tags) */;\nCREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER memories_ai AFTER INSERT ON memories\nWHEN NEW.content IS NOT NULL AND NEW.content != ''\nBEGIN\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));\nEND;\nCREATE TRIGGER memories_ad AFTER DELETE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\nEND;\nCREATE TRIGGER memories_au AFTER UPDATE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));\nEND;\nCREATE VIRTUAL TABLE frames_fts USING fts5(\n full_text,\n app_name,\n window_name,\n browser_url,\n id UNINDEXED,\n tokenize='unicode61'\n)\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":"drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nzsh: command not found: #\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -o -name \"*.sqlite\" 2>/dev/null \n/Users/lukas/.screenpipe/db.sqlite\n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/\nls -lah ~/.screenpipe/data/ 2>/dev/null\nzsh: command not found: s\ntotal 0\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .\ndrwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..\ndrwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data\ndrwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions\n-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\\ Support/ -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name \"*.db\" -path \"*screenpipe*\" 2>/dev/null \n/Users/lukas/.screenpipe/data/screenpipe.db\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E \"\\.db|\\.sqlite\"\nscreenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm\nscreenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite\nscreenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nscreenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".tables\"\n_sqlx_migrations meetings \naudio_chunks memories \naudio_tags memories_fts \naudio_transcriptions memories_fts_config \naudio_transcriptions_fts memories_fts_data \naudio_transcriptions_fts_config memories_fts_docsize \naudio_transcriptions_fts_data memories_fts_idx \naudio_transcriptions_fts_docsize ocr_text \naudio_transcriptions_fts_idx pipe_executions \nelements pipe_scheduler_state \nelements_fts speaker_embeddings \nelements_fts_config speakers \nelements_fts_data tags \nelements_fts_docsize ui_events \nelements_fts_idx ui_events_fts \nframes ui_events_fts_config \nframes_fts ui_events_fts_data \nframes_fts_config ui_events_fts_docsize \nframes_fts_content ui_events_fts_idx \nframes_fts_data video_chunks \nframes_fts_docsize vision_tags \nframes_fts_idx \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \".schema\"\nCREATE TABLE _sqlx_migrations (\n version BIGINT PRIMARY KEY,\n description TEXT NOT NULL,\n installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n success BOOLEAN NOT NULL,\n checksum BLOB NOT NULL,\n execution_time BIGINT NOT NULL\n);\nCREATE TABLE video_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);\nCREATE TABLE sqlite_sequence(name,seq);\nCREATE TABLE audio_chunks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file_path TEXT NOT NULL\n, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);\nCREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE TABLE IF NOT EXISTS \"ocr_text\" (\n frame_id INTEGER NOT NULL,\n text TEXT NOT NULL,\n text_json TEXT,\n app_name TEXT NOT NULL DEFAULT '',\n ocr_engine TEXT NOT NULL DEFAULT 'unknown'\n, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);\nCREATE TABLE tags (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\nCREATE TABLE vision_tags (\n vision_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (vision_id, tag_id),\n FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE TABLE audio_tags (\n audio_chunk_id INTEGER NOT NULL,\n tag_id INTEGER NOT NULL,\n PRIMARY KEY (audio_chunk_id, tag_id),\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,\n FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n);\nCREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);\nCREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);\nCREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);\nCREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);\nCREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);\nCREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);\nCREATE TABLE speakers (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT,\n metadata JSON\n, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);\nCREATE TABLE speaker_embeddings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n embedding FLOAT[512] NOT NULL\n check(\n typeof(embedding) == 'blob'\n and vec_length(embedding) == 512\n ),\n speaker_id INTEGER REFERENCES speakers(id)\n);\nCREATE TABLE IF NOT EXISTS \"audio_transcriptions\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n audio_chunk_id INTEGER NOT NULL,\n offset_index INTEGER NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n transcription TEXT NOT NULL,\n device TEXT NOT NULL DEFAULT '',\n is_input_device BOOLEAN NOT NULL DEFAULT TRUE,\n speaker_id INTEGER,\n transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,\n FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)\n);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);\nCREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);\nCREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);\nCREATE INDEX idx_ocr_text_length ON ocr_text (text_length);\nCREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);\nCREATE TABLE ui_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n session_id TEXT,\n relative_ms INTEGER NOT NULL DEFAULT 0,\n event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard\n -- Position\n x INTEGER,\n y INTEGER,\n delta_x INTEGER,\n delta_y INTEGER,\n -- Mouse/key\n button INTEGER,\n click_count INTEGER,\n key_code INTEGER,\n modifiers INTEGER,\n -- Text content\n text_content TEXT,\n text_length INTEGER,\n -- App context\n app_name TEXT,\n app_pid INTEGER,\n window_title TEXT,\n browser_url TEXT,\n -- Element context (from accessibility APIs)\n element_role TEXT,\n element_name TEXT,\n element_value TEXT,\n element_description TEXT,\n element_automation_id TEXT,\n element_bounds TEXT, -- JSON: {\"x\":0,\"y\":0,\"width\":100,\"height\":50}\n -- Frame correlation\n frame_id INTEGER,\n -- Sync columns\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME\n);\nCREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX idx_ui_events_event_type ON ui_events(event_type);\nCREATE INDEX idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX idx_ui_events_session_id ON ui_events(session_id);\nCREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);\nCREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);\nCREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);\nCREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;\nCREATE VIRTUAL TABLE 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)\n/* ui_events_fts(text_content,app_name,window_title,element_name) */;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\nEND;\nCREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN\n INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)\n VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);\n INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE UNIQUE INDEX idx_audio_transcription_chunk_text\nON audio_transcriptions(audio_chunk_id, transcription);\nCREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);\nCREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);\nCREATE TABLE pipe_executions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n pipe_name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'queued',\n trigger_type TEXT NOT NULL DEFAULT 'manual',\n pid INTEGER,\n model TEXT,\n provider TEXT,\n started_at TEXT,\n finished_at TEXT,\n stdout TEXT DEFAULT '',\n stderr TEXT DEFAULT '',\n exit_code INTEGER,\n error_type TEXT,\n error_message TEXT,\n duration_ms INTEGER\n, session_path TEXT);\nCREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);\nCREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';\nCREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);\nCREATE TABLE pipe_scheduler_state (\n pipe_name TEXT PRIMARY KEY,\n last_run_at TEXT,\n last_success_at TEXT,\n consecutive_failures INTEGER DEFAULT 0\n);\nCREATE TABLE IF NOT EXISTS \"frames\" (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n video_chunk_id INTEGER DEFAULT NULL,\n offset_index INTEGER NOT NULL DEFAULT 0,\n timestamp TIMESTAMP NOT NULL,\n name TEXT,\n app_name TEXT DEFAULT NULL,\n window_name TEXT DEFAULT NULL,\n focused BOOLEAN DEFAULT NULL,\n browser_url TEXT DEFAULT NULL,\n device_name TEXT NOT NULL DEFAULT '',\n sync_id TEXT,\n machine_id TEXT,\n synced_at DATETIME,\n -- New event-driven capture columns\n snapshot_path TEXT DEFAULT NULL,\n accessibility_text TEXT DEFAULT NULL,\n accessibility_tree_json TEXT DEFAULT NULL,\n content_hash INTEGER DEFAULT NULL,\n simhash INTEGER DEFAULT NULL,\n capture_trigger TEXT DEFAULT NULL,\n text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,\n FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)\n);\nCREATE INDEX idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX idx_frames_timestamp_device\n ON frames(timestamp, device_name);\nCREATE INDEX idx_frames_snapshot_path\n ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;\nCREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN\n INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)\n VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);\nEND;\nCREATE TABLE meetings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n meeting_start TEXT NOT NULL,\n meeting_end TEXT,\n meeting_app TEXT NOT NULL,\n title TEXT,\n attendees TEXT,\n detection_source TEXT NOT NULL DEFAULT 'app',\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, note TEXT);\nCREATE INDEX idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX idx_meetings_end ON meetings(meeting_end);\nCREATE TABLE elements (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n frame_id INTEGER NOT NULL,\n source TEXT NOT NULL, -- 'ocr' | 'accessibility'\n role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'\n -- AX: 'AXButton','AXTextField','AXStaticText', etc.\n text TEXT, -- element text content (NULL for container nodes)\n parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)\n depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)\n left_bound REAL, -- normalized 0-1 bounding box\n top_bound REAL,\n width_bound REAL,\n height_bound REAL,\n confidence REAL, -- OCR confidence (0-100), NULL for AX\n sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent\n FOREIGN KEY (frame_id) REFERENCES frames(id),\n FOREIGN KEY (parent_id) REFERENCES elements(id)\n);\nCREATE INDEX idx_elements_frame_id ON elements(frame_id);\nCREATE INDEX idx_elements_parent_id ON elements(parent_id);\nCREATE INDEX idx_elements_source ON elements(source);\nCREATE INDEX idx_elements_frame_source ON elements(frame_id, source);\nCREATE VIRTUAL TABLE elements_fts USING fts5(\n text,\n role,\n frame_id UNINDEXED,\n content='elements',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* elements_fts(text,role,frame_id) */;\nCREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER elements_ai AFTER INSERT ON elements\nWHEN NEW.text IS NOT NULL AND NEW.text != ''\nBEGIN\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE TRIGGER elements_ad AFTER DELETE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\nEND;\nCREATE TRIGGER elements_au AFTER UPDATE ON elements\nWHEN OLD.text IS NOT NULL AND OLD.text != ''\nBEGIN\n INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)\n VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);\n INSERT INTO elements_fts(rowid, text, role, frame_id)\n VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);\nEND;\nCREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(\n transcription,\n device,\n speaker_id,\n content='audio_transcriptions',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* audio_transcriptions_fts(transcription,device,speaker_id) */;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions\nWHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\nEND;\nCREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions\nWHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''\nBEGIN\n INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)\n VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);\n INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)\n VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);\nEND;\nCREATE INDEX idx_video_chunks_cloud_blob_id\n ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;\nCREATE INDEX idx_frames_cloud_blob_id\n ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;\nCREATE TABLE memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT 'user',\n source_context TEXT,\n tags TEXT DEFAULT '[]',\n importance REAL DEFAULT 0.5,\n created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),\n updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))\n, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);\nCREATE INDEX idx_memories_created_at ON memories(created_at);\nCREATE INDEX idx_memories_importance ON memories(importance DESC);\nCREATE INDEX idx_memories_source ON memories(source);\nCREATE VIRTUAL TABLE memories_fts USING fts5(\n content,\n tags,\n content='memories',\n content_rowid='id',\n tokenize='unicode61'\n)\n/* memories_fts(content,tags) */;\nCREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER memories_ai AFTER INSERT ON memories\nWHEN NEW.content IS NOT NULL AND NEW.content != ''\nBEGIN\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));\nEND;\nCREATE TRIGGER memories_ad AFTER DELETE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\nEND;\nCREATE TRIGGER memories_au AFTER UPDATE ON memories\nWHEN OLD.content IS NOT NULL AND OLD.content != ''\nBEGIN\n INSERT INTO memories_fts(memories_fts, rowid, content, tags)\n VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));\n INSERT INTO memories_fts(rowid, content, tags)\n VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));\nEND;\nCREATE VIRTUAL TABLE frames_fts USING fts5(\n full_text,\n app_name,\n window_name,\n browser_url,\n id UNINDEXED,\n tokenize='unicode61'\n)\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
5853192385605379516
|
3173372984674339333
|
click
|
accessibility
|
NULL
|
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
zsh: command not found: #
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -o -name "*.sqlite" 2>/dev/null
/Users/lukas/.screenpipe/db.sqlite
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ s -lah ~/.screenpipe/
ls -lah ~/.screenpipe/data/ 2>/dev/null
zsh: command not found: s
total 0
drwxr-xr-x 5 lukas staff 160B 11 Apr 15:03 .
drwxr-xr-x 10 lukas staff 320B 11 Apr 14:52 ..
drwxr-xr-x 5 lukas staff 160B 11 Apr 14:52 data
drwxr-xr-x 2 lukas staff 64B 9 Apr 20:05 pending-transcriptions
-rw-r--r-- 1 lukas staff 0B 11 Apr 15:03 screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/Library/Application\ Support/ -name "*.db" -path "*screenpipe*" 2>/dev/null
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ find ~/.screenpipe -name "*.db" -path "*screenpipe*" 2>/dev/null
/Users/lukas/.screenpipe/data/screenpipe.db
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ lsof -p $(pgrep screenpipe) | grep -E "\.db|\.sqlite"
screenpip 20525 lukas txt REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas txt REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 17u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 22u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 23u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 24u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 25u REG 1,15 32768 220914771 /Users/lukas/.screenpipe/db.sqlite-shm
screenpip 20525 lukas 26u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 27u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 28u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 29u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 31u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 33u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 55u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 56u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 57u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 58u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 59u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 60u REG 1,15 70270976 220904259 /Users/lukas/.screenpipe/db.sqlite
screenpip 20525 lukas 61u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
screenpip 20525 lukas 62u REG 1,15 16533592 220914770 /Users/lukas/.screenpipe/db.sqlite-wal
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".tables"
_sqlx_migrations meetings
audio_chunks memories
audio_tags memories_fts
audio_transcriptions memories_fts_config
audio_transcriptions_fts memories_fts_data
audio_transcriptions_fts_config memories_fts_docsize
audio_transcriptions_fts_data memories_fts_idx
audio_transcriptions_fts_docsize ocr_text
audio_transcriptions_fts_idx pipe_executions
elements pipe_scheduler_state
elements_fts speaker_embeddings
elements_fts_config speakers
elements_fts_data tags
elements_fts_docsize ui_events
elements_fts_idx ui_events_fts
frames ui_events_fts_config
frames_fts ui_events_fts_data
frames_fts_config ui_events_fts_docsize
frames_fts_content ui_events_fts_idx
frames_fts_data video_chunks
frames_fts_docsize vision_tags
frames_fts_idx
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite ".schema"
CREATE TABLE _sqlx_migrations (
version BIGINT PRIMARY KEY,
description TEXT NOT NULL,
installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
success BOOLEAN NOT NULL,
checksum BLOB NOT NULL,
execution_time BIGINT NOT NULL
);
CREATE TABLE video_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, device_name TEXT NOT NULL DEFAULT '', sync_id TEXT, machine_id TEXT, synced_at DATETIME, fps REAL NOT NULL DEFAULT 0.5, cloud_blob_id TEXT DEFAULT NULL);
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE audio_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_path TEXT NOT NULL
, timestamp TIMESTAMP, sync_id TEXT, machine_id TEXT, synced_at DATETIME);
CREATE INDEX idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE TABLE IF NOT EXISTS "ocr_text" (
frame_id INTEGER NOT NULL,
text TEXT NOT NULL,
text_json TEXT,
app_name TEXT NOT NULL DEFAULT '',
ocr_engine TEXT NOT NULL DEFAULT 'unknown'
, window_name TEXT, focused BOOLEAN DEFAULT FALSE, text_length INTEGER, sync_id TEXT, synced_at DATETIME);
CREATE TABLE tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE vision_tags (
vision_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (vision_id, tag_id),
FOREIGN KEY (vision_id) REFERENCES frames(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE TABLE audio_tags (
audio_chunk_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (audio_chunk_id, tag_id),
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE INDEX idx_vision_tags_vision_id ON vision_tags(vision_id);
CREATE INDEX idx_vision_tags_tag_id ON vision_tags(tag_id);
CREATE INDEX idx_audio_tags_audio_chunk_id ON audio_tags(audio_chunk_id);
CREATE INDEX idx_audio_tags_tag_id ON audio_tags(tag_id);
CREATE INDEX idx_ocr_text_frame_id ON ocr_text(frame_id);
CREATE INDEX idx_ocr_text_frame_app_window ON ocr_text(frame_id, app_name, window_name);
CREATE TABLE speakers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
metadata JSON
, hallucination BOOLEAN DEFAULT FALSE, centroid FLOAT[512], embedding_count INTEGER DEFAULT 0);
CREATE TABLE speaker_embeddings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
embedding FLOAT[512] NOT NULL
check(
typeof(embedding) == 'blob'
and vec_length(embedding) == 512
),
speaker_id INTEGER REFERENCES speakers(id)
);
CREATE TABLE IF NOT EXISTS "audio_transcriptions" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
audio_chunk_id INTEGER NOT NULL,
offset_index INTEGER NOT NULL,
timestamp TIMESTAMP NOT NULL,
transcription TEXT NOT NULL,
device TEXT NOT NULL DEFAULT '',
is_input_device BOOLEAN NOT NULL DEFAULT TRUE,
speaker_id INTEGER,
transcription_engine TEXT NOT NULL DEFAULT 'Whisper', start_time REAL, end_time REAL, text_length INTEGER, sync_id TEXT, synced_at DATETIME,
FOREIGN KEY (audio_chunk_id) REFERENCES audio_chunks(id)
);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id_timestamp ON audio_transcriptions(audio_chunk_id, timestamp);
CREATE INDEX idx_audio_transcriptions_audio_chunk_id ON audio_transcriptions(audio_chunk_id);
CREATE INDEX idx_audio_transcriptions_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX idx_audio_transcriptions_transcription ON audio_transcriptions(transcription);
CREATE INDEX idx_ocr_text_length ON ocr_text (text_length);
CREATE INDEX idx_audio_transcriptions_length ON audio_transcriptions (text_length);
CREATE TABLE ui_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
session_id TEXT,
relative_ms INTEGER NOT NULL DEFAULT 0,
event_type TEXT NOT NULL, -- click, move, scroll, key, text, app_switch, window_focus, clipboard
-- Position
x INTEGER,
y INTEGER,
delta_x INTEGER,
delta_y INTEGER,
-- Mouse/key
button INTEGER,
click_count INTEGER,
key_code INTEGER,
modifiers INTEGER,
-- Text content
text_content TEXT,
text_length INTEGER,
-- App context
app_name TEXT,
app_pid INTEGER,
window_title TEXT,
browser_url TEXT,
-- Element context (from accessibility APIs)
element_role TEXT,
element_name TEXT,
element_value TEXT,
element_description TEXT,
element_automation_id TEXT,
element_bounds TEXT, -- JSON: {"x":0,"y":0,"width":100,"height":50}
-- Frame correlation
frame_id INTEGER,
-- Sync columns
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME
);
CREATE INDEX idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX idx_ui_events_event_type ON ui_events(event_type);
CREATE INDEX idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX idx_ui_events_session_id ON ui_events(session_id);
CREATE INDEX idx_ui_events_frame_id ON ui_events(frame_id);
CREATE INDEX idx_ui_events_sync_id ON ui_events(sync_id);
CREATE INDEX idx_ui_events_synced_at ON ui_events(synced_at);
CREATE INDEX idx_ui_events_unsynced ON ui_events(synced_at) WHERE synced_at IS NULL;
CREATE VIRTUAL TABLE ui_events_fts USING fts5(
text_content,
app_name,
window_title,
element_name,
content='ui_events',
content_rowid='id',
tokenize='unicode61'
)
/* ui_events_fts(text_content,app_name,window_title,element_name) */;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'ui_events_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'ui_events_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER ui_events_ad AFTER DELETE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
END;
CREATE TRIGGER ui_events_au AFTER UPDATE ON ui_events BEGIN
INSERT INTO ui_events_fts(ui_events_fts, rowid, text_content, app_name, window_title, element_name)
VALUES('delete', OLD.id, OLD.text_content, OLD.app_name, OLD.window_title, OLD.element_name);
INSERT INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE UNIQUE INDEX idx_audio_transcription_chunk_text
ON audio_transcriptions(audio_chunk_id, transcription);
CREATE INDEX idx_video_chunks_device_name ON video_chunks(device_name);
CREATE INDEX idx_video_chunks_device_name_id ON video_chunks(device_name, id DESC);
CREATE TABLE pipe_executions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pipe_name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'queued',
trigger_type TEXT NOT NULL DEFAULT 'manual',
pid INTEGER,
model TEXT,
provider TEXT,
started_at TEXT,
finished_at TEXT,
stdout TEXT DEFAULT '',
stderr TEXT DEFAULT '',
exit_code INTEGER,
error_type TEXT,
error_message TEXT,
duration_ms INTEGER
, session_path TEXT);
CREATE INDEX idx_pipe_exec_name_status ON pipe_executions(pipe_name, status);
CREATE INDEX idx_pipe_exec_running ON pipe_executions(status) WHERE status = 'running';
CREATE INDEX idx_pipe_exec_name_time ON pipe_executions(pipe_name, id DESC);
CREATE TABLE pipe_scheduler_state (
pipe_name TEXT PRIMARY KEY,
last_run_at TEXT,
last_success_at TEXT,
consecutive_failures INTEGER DEFAULT 0
);
CREATE TABLE IF NOT EXISTS "frames" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
video_chunk_id INTEGER DEFAULT NULL,
offset_index INTEGER NOT NULL DEFAULT 0,
timestamp TIMESTAMP NOT NULL,
name TEXT,
app_name TEXT DEFAULT NULL,
window_name TEXT DEFAULT NULL,
focused BOOLEAN DEFAULT NULL,
browser_url TEXT DEFAULT NULL,
device_name TEXT NOT NULL DEFAULT '',
sync_id TEXT,
machine_id TEXT,
synced_at DATETIME,
-- New event-driven capture columns
snapshot_path TEXT DEFAULT NULL,
accessibility_text TEXT DEFAULT NULL,
accessibility_tree_json TEXT DEFAULT NULL,
content_hash INTEGER DEFAULT NULL,
simhash INTEGER DEFAULT NULL,
capture_trigger TEXT DEFAULT NULL,
text_source TEXT DEFAULT NULL, cloud_blob_id TEXT DEFAULT NULL, full_text TEXT DEFAULT NULL, elements_ref_frame_id INTEGER DEFAULT NULL,
FOREIGN KEY (video_chunk_id) REFERENCES video_chunks(id)
);
CREATE INDEX idx_frames_timestamp ON frames(timestamp);
CREATE INDEX idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX idx_frames_timestamp_device
ON frames(timestamp, device_name);
CREATE INDEX idx_frames_snapshot_path
ON frames(snapshot_path) WHERE snapshot_path IS NOT NULL;
CREATE TRIGGER ui_events_ai AFTER INSERT ON ui_events BEGIN
INSERT OR IGNORE INTO ui_events_fts(rowid, text_content, app_name, window_title, element_name)
VALUES (NEW.id, NEW.text_content, NEW.app_name, NEW.window_title, NEW.element_name);
END;
CREATE TABLE meetings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
meeting_start TEXT NOT NULL,
meeting_end TEXT,
meeting_app TEXT NOT NULL,
title TEXT,
attendees TEXT,
detection_source TEXT NOT NULL DEFAULT 'app',
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, note TEXT);
CREATE INDEX idx_meetings_start ON meetings(meeting_start);
CREATE INDEX idx_meetings_end ON meetings(meeting_end);
CREATE TABLE elements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
frame_id INTEGER NOT NULL,
source TEXT NOT NULL, -- 'ocr' | 'accessibility'
role TEXT NOT NULL, -- OCR: 'page','block','paragraph','line','word'
-- AX: 'AXButton','AXTextField','AXStaticText', etc.
text TEXT, -- element text content (NULL for container nodes)
parent_id INTEGER, -- self-referential FK for tree hierarchy (NULL = root)
depth INTEGER NOT NULL DEFAULT 0, -- tree depth (0 = root)
left_bound REAL, -- normalized 0-1 bounding box
top_bound REAL,
width_bound REAL,
height_bound REAL,
confidence REAL, -- OCR confidence (0-100), NULL for AX
sort_order INTEGER NOT NULL DEFAULT 0, properties TEXT, -- sibling order within parent
FOREIGN KEY (frame_id) REFERENCES frames(id),
FOREIGN KEY (parent_id) REFERENCES elements(id)
);
CREATE INDEX idx_elements_frame_id ON elements(frame_id);
CREATE INDEX idx_elements_parent_id ON elements(parent_id);
CREATE INDEX idx_elements_source ON elements(source);
CREATE INDEX idx_elements_frame_source ON elements(frame_id, source);
CREATE VIRTUAL TABLE elements_fts USING fts5(
text,
role,
frame_id UNINDEXED,
content='elements',
content_rowid='id',
tokenize='unicode61'
)
/* elements_fts(text,role,frame_id) */;
CREATE TABLE IF NOT EXISTS 'elements_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'elements_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'elements_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER elements_ai AFTER INSERT ON elements
WHEN NEW.text IS NOT NULL AND NEW.text != ''
BEGIN
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE TRIGGER elements_ad AFTER DELETE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
END;
CREATE TRIGGER elements_au AFTER UPDATE ON elements
WHEN OLD.text IS NOT NULL AND OLD.text != ''
BEGIN
INSERT INTO elements_fts(elements_fts, rowid, text, role, frame_id)
VALUES ('delete', OLD.id, OLD.text, OLD.role, OLD.frame_id);
INSERT INTO elements_fts(rowid, text, role, frame_id)
VALUES (NEW.id, NEW.text, NEW.role, NEW.frame_id);
END;
CREATE VIRTUAL TABLE audio_transcriptions_fts USING fts5(
transcription,
device,
speaker_id,
content='audio_transcriptions',
content_rowid='id',
tokenize='unicode61'
)
/* audio_transcriptions_fts(transcription,device,speaker_id) */;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'audio_transcriptions_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER audio_transcriptions_ai AFTER INSERT ON audio_transcriptions
WHEN NEW.transcription IS NOT NULL AND NEW.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, NEW.transcription, COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_delete AFTER DELETE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
END;
CREATE TRIGGER audio_transcriptions_update AFTER UPDATE ON audio_transcriptions
WHEN OLD.transcription IS NOT NULL AND OLD.transcription != ''
BEGIN
INSERT INTO audio_transcriptions_fts(audio_transcriptions_fts, rowid, transcription, device, speaker_id)
VALUES ('delete', OLD.id, OLD.transcription, COALESCE(OLD.device, ''), OLD.speaker_id);
INSERT INTO audio_transcriptions_fts(rowid, transcription, device, speaker_id)
VALUES (NEW.id, COALESCE(NEW.transcription, ''), COALESCE(NEW.device, ''), NEW.speaker_id);
END;
CREATE INDEX idx_video_chunks_cloud_blob_id
ON video_chunks(cloud_blob_id) WHERE cloud_blob_id IS NULL;
CREATE INDEX idx_frames_cloud_blob_id
ON frames(cloud_blob_id) WHERE cloud_blob_id IS NULL AND snapshot_path IS NOT NULL;
CREATE TABLE memories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
content TEXT NOT NULL,
source TEXT NOT NULL DEFAULT 'user',
source_context TEXT,
tags TEXT DEFAULT '[]',
importance REAL DEFAULT 0.5,
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
, frame_id INTEGER REFERENCES frames(id) ON DELETE SET NULL);
CREATE INDEX idx_memories_created_at ON memories(created_at);
CREATE INDEX idx_memories_importance ON memories(importance DESC);
CREATE INDEX idx_memories_source ON memories(source);
CREATE VIRTUAL TABLE memories_fts USING fts5(
content,
tags,
content='memories',
content_rowid='id',
tokenize='unicode61'
)
/* memories_fts(content,tags) */;
CREATE TABLE IF NOT EXISTS 'memories_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'memories_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'memories_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER memories_ai AFTER INSERT ON memories
WHEN NEW.content IS NOT NULL AND NEW.content != ''
BEGIN
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, NEW.content, COALESCE(NEW.tags, ''));
END;
CREATE TRIGGER memories_ad AFTER DELETE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
END;
CREATE TRIGGER memories_au AFTER UPDATE ON memories
WHEN OLD.content IS NOT NULL AND OLD.content != ''
BEGIN
INSERT INTO memories_fts(memories_fts, rowid, content, tags)
VALUES ('delete', OLD.id, OLD.content, COALESCE(OLD.tags, ''));
INSERT INTO memories_fts(rowid, content, tags)
VALUES (NEW.id, COALESCE(NEW.content, ''), COALESCE(NEW.tags, ''));
END;
CREATE VIRTUAL TABLE frames_fts USING fts5(
full_text,
app_name,
window_name,
browser_url,
id UNINDEXED,
tokenize='unicode61'
)
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
720
|
17
|
5
|
2026-04-11T12:09:39.363085+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909379363_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-4034464612027230115
|
7936206669882842100
|
clipboard
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
719
|
|
721
|
17
|
6
|
2026-04-11T12:09:42.682733+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909382682_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-332181317459790359
|
7936206669614402548
|
visual_change
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
722
|
17
|
7
|
2026-04-11T12:09:56.125812+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909396125_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹ 40lhl100% C-zshDOCKER• ₴1DEV (-zsh)O $2APP (-zsh)• *3-zsh• 84-zshlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)BY date(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $|• *5-zsh• 86frames FROM frames GROUPSat 11 Apr 15:09:55T81-zshX7BY date(timestamp)ORDER...
|
NULL
|
3700243769288638945
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹ 40lhl100% C-zshDOCKER• ₴1DEV (-zsh)O $2APP (-zsh)• *3-zsh• 84-zshlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)BY date(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $|• *5-zsh• 86frames FROM frames GROUPSat 11 Apr 15:09:55T81-zshX7BY date(timestamp)ORDER...
|
721
|
|
723
|
17
|
8
|
2026-04-11T12:09:56.753136+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909396753_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShelllEditViewSessionScriptsProfilesWindowHe iTerm2ShelllEditViewSessionScriptsProfilesWindowHelp‹ $0(ahl100% <7-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zshlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)BY date(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ l• ₴5-zshO 886frames FROM frames GROUPSat 11 Apr 15:09:56181-zsh*7BY date(timestamp)ORDER...
|
NULL
|
-9129933927592684585
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShelllEditViewSessionScriptsProfilesWindowHe iTerm2ShelllEditViewSessionScriptsProfilesWindowHelp‹ $0(ahl100% <7-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zshlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)BY date(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ l• ₴5-zshO 886frames FROM frames GROUPSat 11 Apr 15:09:56181-zsh*7BY date(timestamp)ORDER...
|
NULL
|
|
724
|
17
|
9
|
2026-04-11T12:09:57.390178+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909397390_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-332181317459790359
|
7936206669614402548
|
click
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
723
|
|
725
|
17
|
10
|
2026-04-11T12:09:58.370975+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909398370_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-1 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-1 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-1 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
8864343563964157069
|
7936347407102757812
|
clipboard
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-1 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
726
|
17
|
11
|
2026-04-11T12:10:29.432329+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909429432_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplhl-zshDOCKER• ₴1DEV (-zsh)-O $2APP (-zsh)• *3-zsh• 84-zshlukas@Lukas-Kovaliks-MacBook-Pro-JiminnyBY~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)date(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/ screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;"iTerm2|185113.9Dial3112.3Safaril2011.5Claude|1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $|• *5100% CSat 11 Apr 15:10:29T81-zshO ₴6-zsh*7frames FROM frames GROUPBY date(timestamp)ORDER...
|
NULL
|
905455032535114476
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplhl-zshDOCKER• ₴1DEV (-zsh)-O $2APP (-zsh)• *3-zsh• 84-zshlukas@Lukas-Kovaliks-MacBook-Pro-JiminnyBY~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)date(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/ screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;"iTerm2|185113.9Dial3112.3Safaril2011.5Claude|1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $|• *5100% CSat 11 Apr 15:10:29T81-zshO ₴6-zsh*7frames FROM frames GROUPBY date(timestamp)ORDER...
|
725
|
|
727
|
17
|
12
|
2026-04-11T12:10:31.128387+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909431128_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0(ahl100% <7• 0-zshDOCKERO ₴1DEV (-zsh)-O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5lukas@Lukas-Kovaliks-MacBook-Pro-JiminnyBY~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)asdate(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTapp_name, COUNT(*) as frames,ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;"iTerm2|185113.9Dial3112.3Safaril2011.5Claude|1210.9UserNotificationCenter1410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ П-zshO ₴6frames FROM frames GROUPSat 11 Apr 15:10:30181-zsh*7BY date(timestamp)ORDER...
|
NULL
|
-8523551236030448221
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0(ahl100% <7• 0-zshDOCKERO ₴1DEV (-zsh)-O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5lukas@Lukas-Kovaliks-MacBook-Pro-JiminnyBY~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)asdate(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTapp_name, COUNT(*) as frames,ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;"iTerm2|185113.9Dial3112.3Safaril2011.5Claude|1210.9UserNotificationCenter1410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ П-zshO ₴6frames FROM frames GROUPSat 11 Apr 15:10:30181-zsh*7BY date(timestamp)ORDER...
|
NULL
|
|
728
|
17
|
13
|
2026-04-11T12:10:31.782354+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909431782_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
7975991961833669851
|
7936347407106952116
|
click
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
727
|
|
729
|
17
|
14
|
2026-04-11T12:10:32.514407+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909432514_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
4165807506915910114
|
7936347407106952116
|
clipboard
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
730
|
17
|
15
|
2026-04-11T12:10:34.147103+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909434147_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-1 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-1 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-1 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
8552368549857249682
|
7937473341373533108
|
visual_change
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-1 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
729
|
|
731
|
17
|
16
|
2026-04-11T12:10:53.117178+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909453117_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplhl-zshDOCKER• ₴1DEV (-zsh)O $2APP (-zsh)• *з-zsh• 84-zshlukas@Lukas-Kovaliks-MacBook-Pro-JiminnyBY~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)date(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTapp_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHERE date(timestamp) = date("now', '-2 day')AND app_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;"iTerm2|185113.9Dial3112.3Safaril2011.5Claude|1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date("now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $• *5100% C-zsh• ₴6frames FROM frames GROUPSat 11 Apr 15:10:52T81-zsh*7BY date(timestamp)ORDER...
|
NULL
|
-2687616628962651192
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplhl-zshDOCKER• ₴1DEV (-zsh)O $2APP (-zsh)• *з-zsh• 84-zshlukas@Lukas-Kovaliks-MacBook-Pro-JiminnyBY~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)date(timestamp);"2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTapp_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHERE date(timestamp) = date("now', '-2 day')AND app_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;"iTerm2|185113.9Dial3112.3Safaril2011.5Claude|1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date("now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $• *5100% C-zsh• ₴6frames FROM frames GROUPSat 11 Apr 15:10:52T81-zsh*7BY date(timestamp)ORDER...
|
NULL
|
|
732
|
17
|
17
|
2026-04-11T12:10:54.789098+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909454789_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0(ahl100% <7Sat 11 Apr 15:10:54• 0-zsh181DOCKERO ₴1DEV (-zsh)-O $2APP (-zsh)• *з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7lukas@Lukas-Kovaliks-MacBook-Pro-Jiminnydate(timestamp);"BY date(timestamp)BY~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)asframes FROM frames GROUPORDER2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTapp_name, COUNT(*) as frames,ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;"iTerm2|185113.9Dial3112.3Safaril2011.5Claude|1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ П...
|
NULL
|
-1059676791695118817
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0(ahl100% <7Sat 11 Apr 15:10:54• 0-zsh181DOCKERO ₴1DEV (-zsh)-O $2APP (-zsh)• *з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7lukas@Lukas-Kovaliks-MacBook-Pro-Jiminnydate(timestamp);"BY date(timestamp)BY~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*)asframes FROM frames GROUPORDER2026-04-0915232026-04-11|197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECTapp_name, COUNT(*) as frames,ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;"iTerm2|185113.9Dial3112.3Safaril2011.5Claude|1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ П...
|
731
|
|
733
|
17
|
18
|
2026-04-11T12:10:55.804976+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909455804_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
9206977607410668598
|
7936347475826428852
|
click
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
734
|
17
|
19
|
2026-04-11T12:10:56.864575+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909456864_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-1 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-1 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-1 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-4731763117813192749
|
7937473375733269428
|
clipboard
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-1 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
733
|
|
735
|
17
|
20
|
2026-04-11T12:11:26.355864+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909486355_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
2193639622446553113
|
7937336967571948468
|
click
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
736
|
17
|
21
|
2026-04-11T12:11:31.472371+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909491472_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
ITerm2ShellEdit ViewSessionScriptsProfilesWindow ITerm2ShellEdit ViewSessionScriptsProfilesWindow Helpll.0100% C47-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)•*3-zshControl Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas®Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY framesDESCLIMIT 20;• *4-[URL_WITH_CREDENTIALS] ~/.screenpipe $• *5-zsh* *6Sat 11 Apr 15:11:31-zshT81*7...
|
NULL
|
-881415928532834425
|
NULL
|
click
|
ocr
|
NULL
|
ITerm2ShellEdit ViewSessionScriptsProfilesWindow ITerm2ShellEdit ViewSessionScriptsProfilesWindow Helpll.0100% C47-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)•*3-zshControl Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas®Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY framesDESCLIMIT 20;• *4-[URL_WITH_CREDENTIALS] ~/.screenpipe $• *5-zsh* *6Sat 11 Apr 15:11:31-zshT81*7...
|
735
|
|
737
|
17
|
22
|
2026-04-11T12:11:32.051765+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909492051_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelpC$Ш OOA100% C47-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• *3-zshControl Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas®Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY framesDESCLIMIT 20;• *4-[URL_WITH_CREDENTIALS] ~/.screenpipe $• *5-zshS-₴66Sat 11 Apr 15:11:31-zshT81X7...
|
NULL
|
377600499821858474
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelpC$Ш OOA100% C47-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• *3-zshControl Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas®Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY framesDESCLIMIT 20;• *4-[URL_WITH_CREDENTIALS] ~/.screenpipe $• *5-zshS-₴66Sat 11 Apr 15:11:31-zshT81X7...
|
NULL
|
|
738
|
17
|
23
|
2026-04-11T12:11:32.842626+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909492842_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelpC$Ш OOA100% C47-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• *3-zshControl Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas®Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY framesDESCLIMIT 20;• *4-[URL_WITH_CREDENTIALS] ~/.screenpipe $• *5-zsh₴86Sat 11 Apr 15:11:32-zshT81X7...
|
NULL
|
-6888013795616692278
|
NULL
|
clipboard
|
ocr
|
NULL
|
iTerm2Shell Edit ViewSessionScriptsProfilesWindo iTerm2Shell Edit ViewSessionScriptsProfilesWindowHelpC$Ш OOA100% C47-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• *3-zshControl Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas®Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY framesDESCLIMIT 20;• *4-[URL_WITH_CREDENTIALS] ~/.screenpipe $• *5-zsh₴86Sat 11 Apr 15:11:32-zshT81X7...
|
737
|
|
739
|
17
|
24
|
2026-04-11T12:11:45.963964+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909505963_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
2193639622446553113
|
7937336967571948468
|
click
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
740
|
17
|
25
|
2026-04-11T12:12:17.202755+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909537202_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
2193639622446553113
|
7937336967571948468
|
idle
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
739
|
|
741
|
17
|
26
|
2026-04-11T12:12:47.324131+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909567324_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
2193639622446553113
|
7937336967571948468
|
idle
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
739
|
|
742
|
17
|
27
|
2026-04-11T12:12:52.147253+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909572147_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplhl100% <47Sat 11 Apr 15:12:51••-zshT&1DOCKERO ₴1DEV (-zsh)O ₴2APP (-zsh)• *3-zsh• 84-zsh• *5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter1410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
6808448918636672336
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplhl100% <47Sat 11 Apr 15:12:51••-zshT&1DOCKERO ₴1DEV (-zsh)O ₴2APP (-zsh)• *3-zsh• 84-zsh• *5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter1410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
739
|
|
743
|
17
|
28
|
2026-04-11T12:12:53.761857+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909573761_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:12:53-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
6244750661853324751
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:12:53-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
|
744
|
17
|
29
|
2026-04-11T12:12:55.265086+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909575265_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:12:54-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
6704958684862977867
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:12:54-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
743
|
|
745
|
17
|
30
|
2026-04-11T12:13:25.658224+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909605658_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:13:25-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
-7108317995447543909
|
NULL
|
idle
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:13:25-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
|
746
|
NULL
|
0
|
2026-04-11T12:13:56.172130+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909636172_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:13:55-zshT81DOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO 886-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
-1611754639886970229
|
NULL
|
idle
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:13:55-zshT81DOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO 886-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
745
|
|
747
|
18
|
0
|
2026-04-11T12:14:26.676370+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909666676_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:14:26-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
6622883273444145346
|
NULL
|
idle
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:14:26-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
|
748
|
18
|
1
|
2026-04-11T12:14:57.157584+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909697157_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:14:56-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
4800071514566830075
|
NULL
|
idle
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:14:56-zshT81DOCKERO ₴1DEV (-zsh)O $2APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO ₴6-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) asest_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
747
|
|
749
|
18
|
2
|
2026-04-11T12:15:27.666731+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909727666_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:15:27-zsh181DOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO 886-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
-3225603978522301467
|
NULL
|
idle
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:15:27-zsh181DOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO 886-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
|
750
|
18
|
3
|
2026-04-11T12:15:58.216944+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909758216_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:15:58-zshT81DOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO 886-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
2167576166789446156
|
NULL
|
idle
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:15:58-zshT81DOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO 886-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
749
|
|
751
|
18
|
4
|
2026-04-11T12:16:23.322253+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909783322_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:16:23-zshT81DOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO 886-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
-7241236935047908153
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahl100% <7Sat 11 Apr 15:16:23-zshT81DOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴з-zsh• 84-zsh• ₴5-zshO 886-zsh*7WHERE text IS NOT NULL;CREATE INDEX idx_frames_sync_id ON frames(sync_id)WHEREsync_id IS NOT NULL;CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHEREsync_id IS NOT NULL;CREATE INDEX idx_audio_transcriptions_sync_id ONaudio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;CREATE INDEX idx_elements_frame_source_role ONelements(frame_id, source, role) WHERE text IS NOT NULL;lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clearlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny:~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDERBY date(timestamp);"2026-04-0915232026-04-111197lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $sqlite3~/.screenpipe/db.sqlite"SELECTapp_name, COUNT(*)as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutesFROM framesWHEREdate(timestamp)= date('now', '-2 day')ANDapp_name IS NOT NULLGROUP BY app_nameORDER BY frames DESC;iTerm2|185|13.9Dial3112.3Safaril2011.5Claude |1210.9UserNotificationCenter|410.3Control Centrel310.2Slack|210.1Activity Monitor|210.1Finder|110.1lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT browser_url, COUNT(*) as framesFROM framesWHERE date(timestamp) = date('now', '-2 day')AND browser_url IS NOT NULLGROUP BY browser_urlORDER BY frames DESCLIMIT 20;[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT app_name,event_type, COUNT(*) as eventsFROM ui_eventsWHERE date(timestamp) = date('now', '-2 day')AND app_name IS NOT NULL...
|
NULL
|
|
752
|
18
|
5
|
2026-04-11T12:16:24.237745+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909784237_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
2193639622446553113
|
7937336967571948468
|
click
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
751
|
|
753
|
18
|
6
|
2026-04-11T12:16:32.044641+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909792044_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplhl100% C-zshDOCKERO ₴1DEV (-zsh)O 882APP (-zsh)|• *3WHEREdate(timestamp)'SDATE'ANDwindow_nameIS NOT NULL AND app_name IS NOT NULLGROUP BY app_name, window_name ORDER BY COUNT(*)DESC LIMIT 20;"-zsh• *4-zshechoHOURLY TIMELINE"echosqlite3 "SDB""SELECT printf('%s%-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))FROM framesWHERE date(timestamp) = 'SDATE' ANDapp_name IS NOT NULLGROUP BY strftime('%H', timestamp), app_nameORDER BY strftime('%H', timestamp), COUNT(*) DESC;"echo"\nCLIPBOARD ACTIVITY"echosqlite3"SDB" "SELECTprintf('%-20s %s', app_name,SUBSTR(text_content, 1, 80))FROM ui_eventsWHEREdate(timestamp) = 'SDATE' ANDevent_type = 'clipboard' AND text_content IS NOT NULLORDER BY timestamp LIMIT 20;"echo"\ngOCR TEXT SAMPLES PER APP"echosqlite3 "SDB""SELECT printf('%-15s%s', o.app_name, SUBSTR(o.text, 1, 80))FROM ocr_text oJOINframes f ON o.frame_id = f.idWHEREdate(f.timestamp) = 'SDATE' AND o.app_name IS NOT NULL AND o.text != **GROUP BY o.app_nameORDER BY o.app_name LIMIT 15;"echo"TOTALS"echosqlite3"SDB""SELECT'Frames:' II COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';sqlite3 "SDB"SELECT 'UI Events: ' |1 COUNT(*) FROM ui_events WHERE date(timestamp) = 'SDATE';sqlite3 "SDB"SELECT 'OCR texts: ' |I COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) - 'SDATE';EOFchmod+x ~/screenpipe-day.shlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ |• 85-zsh• *6Sat 11 Apr 15:16:31-zshT81X7...
|
NULL
|
-3197118930243042167
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplhl100% C-zshDOCKERO ₴1DEV (-zsh)O 882APP (-zsh)|• *3WHEREdate(timestamp)'SDATE'ANDwindow_nameIS NOT NULL AND app_name IS NOT NULLGROUP BY app_name, window_name ORDER BY COUNT(*)DESC LIMIT 20;"-zsh• *4-zshechoHOURLY TIMELINE"echosqlite3 "SDB""SELECT printf('%s%-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))FROM framesWHERE date(timestamp) = 'SDATE' ANDapp_name IS NOT NULLGROUP BY strftime('%H', timestamp), app_nameORDER BY strftime('%H', timestamp), COUNT(*) DESC;"echo"\nCLIPBOARD ACTIVITY"echosqlite3"SDB" "SELECTprintf('%-20s %s', app_name,SUBSTR(text_content, 1, 80))FROM ui_eventsWHEREdate(timestamp) = 'SDATE' ANDevent_type = 'clipboard' AND text_content IS NOT NULLORDER BY timestamp LIMIT 20;"echo"\ngOCR TEXT SAMPLES PER APP"echosqlite3 "SDB""SELECT printf('%-15s%s', o.app_name, SUBSTR(o.text, 1, 80))FROM ocr_text oJOINframes f ON o.frame_id = f.idWHEREdate(f.timestamp) = 'SDATE' AND o.app_name IS NOT NULL AND o.text != **GROUP BY o.app_nameORDER BY o.app_name LIMIT 15;"echo"TOTALS"echosqlite3"SDB""SELECT'Frames:' II COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';sqlite3 "SDB"SELECT 'UI Events: ' |1 COUNT(*) FROM ui_events WHERE date(timestamp) = 'SDATE';sqlite3 "SDB"SELECT 'OCR texts: ' |I COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) - 'SDATE';EOFchmod+x ~/screenpipe-day.shlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ |• 85-zsh• *6Sat 11 Apr 15:16:31-zshT81X7...
|
NULL
|
|
754
|
18
|
7
|
2026-04-11T12:16:32.651908+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909792651_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelp(ahl100% <7-zshDOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴зWHEREdate(timestamp)'SDATE'ANDwindow_nameIS NOT NULL AND app_name IS NOT NULLGROUP BY app_name, window_name ORDER BY COUNT(*)DESC LIMIT 20;"-zsh• *4-zshechoHOURLY TIMELINE"echosqlite3 "SDB""SELECT printf('%s%-20s %3d frames', strftime("%H:00', timestamp), app_name, COUNT(*))FROM framesWHERE date(timestamp) = 'SDATE' ANDapp_name IS NOT NULLGROUP BY strftime('%H', timestamp), app_nameORDER BY strftime('%H', timestamp), COUNT(*) DESC;"echo"\nCLIPBOARD ACTIVITY"echosqlite3"SDB""SELECT printf('%-20s %s', app_name,SUBSTR(text_content, 1, 80))FROM ui_eventsWHEREdate(timestamp) = 'SDATE' ANDevent_type = 'clipboard' AND text_content IS NOT NULLORDER BY timestamp LIMIT 20;"echo"\ngOCR TEXT SAMPLES PER APP"echosqlite3 "SDB""SELECT printf('%-15s%s', o.app_name, SUBSTR(o.text, 1, 80))FROM ocr_text oJOINframes f ON o.frame_id = f.idWHEREdate(f.timestamp) = 'SDATE' AND o.app_name IS NOT NULL AND o.text != **GROUP BY o.app_nameORDER BY o.app_name LIMIT 15;"echo"TOTALS"echosqlite3"SDB""SELECT'Frames:' II COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';sqlite3 "SDB"SELECT 'UI Events: ' |1 COUNT(*) FROM ui_events WHERE date(timestamp) = 'SDATE';sqlite3 "SDB"SELECT 'OCR texts: ' |I COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) - 'SDATE';EOFchmod+x ~/screenpipe-day.shlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ П• ₴5-zshO 886Sat 11 Apr 15:16:32-zshT81X7...
|
NULL
|
-3314561680350471107
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelp(ahl100% <7-zshDOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴зWHEREdate(timestamp)'SDATE'ANDwindow_nameIS NOT NULL AND app_name IS NOT NULLGROUP BY app_name, window_name ORDER BY COUNT(*)DESC LIMIT 20;"-zsh• *4-zshechoHOURLY TIMELINE"echosqlite3 "SDB""SELECT printf('%s%-20s %3d frames', strftime("%H:00', timestamp), app_name, COUNT(*))FROM framesWHERE date(timestamp) = 'SDATE' ANDapp_name IS NOT NULLGROUP BY strftime('%H', timestamp), app_nameORDER BY strftime('%H', timestamp), COUNT(*) DESC;"echo"\nCLIPBOARD ACTIVITY"echosqlite3"SDB""SELECT printf('%-20s %s', app_name,SUBSTR(text_content, 1, 80))FROM ui_eventsWHEREdate(timestamp) = 'SDATE' ANDevent_type = 'clipboard' AND text_content IS NOT NULLORDER BY timestamp LIMIT 20;"echo"\ngOCR TEXT SAMPLES PER APP"echosqlite3 "SDB""SELECT printf('%-15s%s', o.app_name, SUBSTR(o.text, 1, 80))FROM ocr_text oJOINframes f ON o.frame_id = f.idWHEREdate(f.timestamp) = 'SDATE' AND o.app_name IS NOT NULL AND o.text != **GROUP BY o.app_nameORDER BY o.app_name LIMIT 15;"echo"TOTALS"echosqlite3"SDB""SELECT'Frames:' II COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';sqlite3 "SDB"SELECT 'UI Events: ' |1 COUNT(*) FROM ui_events WHERE date(timestamp) = 'SDATE';sqlite3 "SDB"SELECT 'OCR texts: ' |I COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) - 'SDATE';EOFchmod+x ~/screenpipe-day.shlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ П• ₴5-zshO 886Sat 11 Apr 15:16:32-zshT81X7...
|
753
|
|
755
|
18
|
8
|
2026-04-11T12:16:34.470644+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909794470_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelp(ahl100% <7-zshDOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴зWHEREdate(timestamp)'SDATE'ANDwindow_nameIS NOT NULL AND app_name IS NOT NULLGROUP BY app_name, window_name ORDER BY COUNT(*)DESC LIMIT 20;"-zsh• *4-zshechoHOURLY TIMELINE"echosqlite3 "SDB""SELECT printf('%s%-20s %3d frames', strftime("%H:00', timestamp), app_name, COUNT(*))FROM framesWHERE date(timestamp) = 'SDATE' ANDapp_name IS NOT NULLGROUP BY strftime('%H', timestamp), app_nameORDER BY strftime('%H', timestamp), COUNT(*) DESC;"echo"\nCLIPBOARD ACTIVITY"echosqlite3"SDB""SELECT printf('%-20s %s', app_name,SUBSTR(text_content, 1, 80))FROM ui_eventsWHEREdate(timestamp) = 'SDATE' ANDevent_type = 'clipboard' AND text_content IS NOT NULLORDER BY timestamp LIMIT 20;"echo"\ngOCR TEXT SAMPLES PER APP"echosqlite3 "SDB""SELECT printf('%-15s%s', o.app_name, SUBSTR(o.text, 1, 80))FROM ocr_text oJOINframes f ON o.frame_id = f.idWHEREdate(f.timestamp) = 'SDATE' AND o.app_name IS NOT NULL AND o.text != **GROUP BY o.app_nameORDER BY o.app_name LIMIT 15;"echo"TOTALS"echosqlite3"SDB""SELECT'Frames:' II COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';sqlite3 "SDB"SELECT 'UI Events: ' |1 COUNT(*) FROM ui_events WHERE date(timestamp) = 'SDATE';sqlite3 "SDB"SELECT 'OCR texts: ' |I COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) - 'SDATE';EOFchmod+x ~/screenpipe-day.shlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ П• ₴5-zshO 886Sat 11 Apr 15:16:34-zshT81X7...
|
NULL
|
-6142208462243687704
|
NULL
|
clipboard
|
ocr
|
NULL
|
iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHe iTerm2ShellEdit|ViewSessionScriptsProfilesWindowHelp(ahl100% <7-zshDOCKERO ₴1DEV (-zsh)О 882APP (-zsh)• ₴зWHEREdate(timestamp)'SDATE'ANDwindow_nameIS NOT NULL AND app_name IS NOT NULLGROUP BY app_name, window_name ORDER BY COUNT(*)DESC LIMIT 20;"-zsh• *4-zshechoHOURLY TIMELINE"echosqlite3 "SDB""SELECT printf('%s%-20s %3d frames', strftime("%H:00', timestamp), app_name, COUNT(*))FROM framesWHERE date(timestamp) = 'SDATE' ANDapp_name IS NOT NULLGROUP BY strftime('%H', timestamp), app_nameORDER BY strftime('%H', timestamp), COUNT(*) DESC;"echo"\nCLIPBOARD ACTIVITY"echosqlite3"SDB""SELECT printf('%-20s %s', app_name,SUBSTR(text_content, 1, 80))FROM ui_eventsWHEREdate(timestamp) = 'SDATE' ANDevent_type = 'clipboard' AND text_content IS NOT NULLORDER BY timestamp LIMIT 20;"echo"\ngOCR TEXT SAMPLES PER APP"echosqlite3 "SDB""SELECT printf('%-15s%s', o.app_name, SUBSTR(o.text, 1, 80))FROM ocr_text oJOINframes f ON o.frame_id = f.idWHEREdate(f.timestamp) = 'SDATE' AND o.app_name IS NOT NULL AND o.text != **GROUP BY o.app_nameORDER BY o.app_name LIMIT 15;"echo"TOTALS"echosqlite3"SDB""SELECT'Frames:' II COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';sqlite3 "SDB"SELECT 'UI Events: ' |1 COUNT(*) FROM ui_events WHERE date(timestamp) = 'SDATE';sqlite3 "SDB"SELECT 'OCR texts: ' |I COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) - 'SDATE';EOFchmod+x ~/screenpipe-day.shlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ П• ₴5-zshO 886Sat 11 Apr 15:16:34-zshT81X7...
|
NULL
|
|
756
|
18
|
9
|
2026-04-11T12:16:35.414414+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909795414_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
4442845750214603506
|
-1268020670757747836
|
clipboard
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
755
|
|
757
|
18
|
10
|
2026-04-11T12:17:05.515101+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909825515_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 162888
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .
drwx------+ 89 lukas staff 2848 11 Apr 15:16 ..
-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json
drwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data
-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite
-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm
-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls
Applications Documents Movies Public jiminny screenpipe-day.sh
CascadeProjects Downloads Music Untitled 4.spf node_modules yarn.lock
DEV Keychron_Screen Pictures Users raycast
Desktop Library Postman iCloud Drive (Archive) response.bin
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 15:16 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 9 Apr 18:24 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 9 lukas staff 288 11 Apr 14:52 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 162888\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 ..\n-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json\ndrwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data\n-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls\nApplications\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDocuments\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMovies\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPublic\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tjiminny\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe-day.sh\nCascadeProjects\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDownloads\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMusic\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUntitled 4.spf\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tnode_modules\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tyarn.lock\nDEV\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tKeychron_Screen\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPictures\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUsers\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traycast\nDesktop\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tLibrary\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPostman\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tiCloud Drive (Archive)\u0000\tresponse.bin\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 9 Apr 18:24 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 9 lukas staff 288 11 Apr 14:52 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 162888\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 ..\n-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json\ndrwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data\n-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls\nApplications\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDocuments\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMovies\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPublic\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tjiminny\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe-day.sh\nCascadeProjects\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDownloads\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMusic\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUntitled 4.spf\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tnode_modules\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tyarn.lock\nDEV\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tKeychron_Screen\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPictures\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUsers\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traycast\nDesktop\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tLibrary\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPostman\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tiCloud Drive (Archive)\u0000\tresponse.bin\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 9 Apr 18:24 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 9 lukas staff 288 11 Apr 14:52 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-4262253729365247199
|
7955072120212605476
|
idle
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 162888
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .
drwx------+ 89 lukas staff 2848 11 Apr 15:16 ..
-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json
drwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data
-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite
-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm
-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls
Applications Documents Movies Public jiminny screenpipe-day.sh
CascadeProjects Downloads Music Untitled 4.spf node_modules yarn.lock
DEV Keychron_Screen Pictures Users raycast
Desktop Library Postman iCloud Drive (Archive) response.bin
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 15:16 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 9 Apr 18:24 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 9 lukas staff 288 11 Apr 14:52 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
758
|
18
|
11
|
2026-04-11T12:17:05.909494+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909825909_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 162888
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .
drwx------+ 89 lukas staff 2848 11 Apr 15:16 ..
-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json
drwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data
-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite
-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm
-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls
Applications Documents Movies Public jiminny screenpipe-day.sh
CascadeProjects Downloads Music Untitled 4.spf node_modules yarn.lock
DEV Keychron_Screen Pictures Users raycast
Desktop Library Postman iCloud Drive (Archive) response.bin
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 15:16 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 9 Apr 18:24 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 9 lukas staff 288 11 Apr 14:52 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 162888\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 ..\n-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json\ndrwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data\n-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls\nApplications\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDocuments\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMovies\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPublic\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tjiminny\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe-day.sh\nCascadeProjects\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDownloads\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMusic\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUntitled 4.spf\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tnode_modules\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tyarn.lock\nDEV\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tKeychron_Screen\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPictures\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUsers\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traycast\nDesktop\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tLibrary\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPostman\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tiCloud Drive (Archive)\u0000\tresponse.bin\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 9 Apr 18:24 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 9 lukas staff 288 11 Apr 14:52 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 162888\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 ..\n-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json\ndrwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data\n-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls\nApplications\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDocuments\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMovies\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPublic\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tjiminny\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe-day.sh\nCascadeProjects\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDownloads\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMusic\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUntitled 4.spf\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tnode_modules\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tyarn.lock\nDEV\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tKeychron_Screen\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPictures\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUsers\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traycast\nDesktop\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tLibrary\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPostman\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tiCloud Drive (Archive)\u0000\tresponse.bin\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 9 Apr 18:24 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 9 lukas staff 288 11 Apr 14:52 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-8664222300600007459
|
7955072120078387748
|
visual_change
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 162888
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .
drwx------+ 89 lukas staff 2848 11 Apr 15:16 ..
-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json
drwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data
-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite
-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm
-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls
Applications Documents Movies Public jiminny screenpipe-day.sh
CascadeProjects Downloads Music Untitled 4.spf node_modules yarn.lock
DEV Keychron_Screen Pictures Users raycast
Desktop Library Postman iCloud Drive (Archive) response.bin
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 15:16 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 9 Apr 18:24 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 9 lukas staff 288 11 Apr 14:52 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
757
|
|
759
|
18
|
12
|
2026-04-11T12:17:13.732613+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909833732_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)drwxr-xr-x10 lukasstaff11Apr 14:52screenpipedrwxr-xr-x4 lukasstaffFeb09:35sonarlintdrwx-15 lukasstaff8Aug2025.sshdrwxr-xr-xe3lukasstaff9615Aug2025streamlitdrwx-lukasstaff17Oct2022swiftpm-rw-lukasstaff8 Apr19:14•viminfodrwx--5lukasstaff19 Jun2023vscodedrwxr-xr-x@lukasstaff9620 Jan2025- warpdrwxr-xr-xlukasstaffdrwxr-xr-x@5 lukasstaff29Apr2023. wdm26Jan13:03windsurfdrwxr-xr-x4lukasstaff24 Mar12:03yarnlukasstaff-rw-r--r--@lukasstaff30Mar10:12•yarnrc6Apr14:31.zcompdump-rw-r--r--@lukasstaff2Nov20:34-rw-r--r--@lukasstaff9Apr20:30lukasstaff•zprofile-rw-r--r--8-rw-r--r--@lukasstaffApr2022zprofile-copy15Mar2023•zprofile.pysave-rw---lukasstaff29Jun2022.zprofile.save-rw-r--r--1lukasstaff8 Apr-rw--1 lukasstaff2022zprofilees11Apr 11:12drwx-----9 lukasstaff.zsh_history6 May2025zsh_sessions-rw-r--r--@1lukasstaffdrwx-----@9lukasstaff25Jul2025.zshrc9 Apr20:08Applicationsdrwxr-xr-xe2 lukasstaff6422 Oct09:35CascadeProjectsdrwxr-xr-x4 lukasstaff27Oct09:24DEVdrwx--@5 lukasstaff11Apr14:53Desktopdrwx-7 lukasstaff26Mar14:40Documentsdrwx--41 lukasstaff8Apr20:46Downloadsdrwxr-xr-xe4 lukasstaff17 Mar20:27drwx-112 lukasstaffKeychron_Screen2 Dec09:19drwx7 lukasstaffLibrary12Feb2024Moviesdrwx-5 lukasstaffdrwx9 lukasstaff25Sep2023Music25Sep2023Picturesdrwx-3 lukasstaff968 Nov2021Postmandrwx-4 lukasstaff28 Oct2021Public-rw-r-r--@1lukasstaff15 Dec09:16Untitled 4.spfdrwx-4 lukasstaff2Jul2023Usersdrwx-lukasstaff9630Sep2022iCloud Drive (Archive)drwx-16 lukasstaff3Novdrwxr-xr-x3 lukasstaff11:35jiminny9620Mar18:47node_modulesdrwxr-xr-x4 lukasstaff21 Oct18:15raycastlukasstaff1 Mar14:26-rwxr-xr-x1 lukasstaffresponse.bin382411Apr15:16screenpipe-day.sh-rw-r--r--1 lukasstaff8620 Mar18:47yarn. locklukas@Lukas-Kovaliks-MacBook-Pro-Jiminny$• *3-zsh• *4zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381-zshlhl• 85-zsh100% C• *6Sat 11 Apr 15:17:13-zshT81*7...
|
NULL
|
6722699393496205478
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp-zshDOCKERO ₴1DEV (-zsh)O $2APP (-zsh)drwxr-xr-x10 lukasstaff11Apr 14:52screenpipedrwxr-xr-x4 lukasstaffFeb09:35sonarlintdrwx-15 lukasstaff8Aug2025.sshdrwxr-xr-xe3lukasstaff9615Aug2025streamlitdrwx-lukasstaff17Oct2022swiftpm-rw-lukasstaff8 Apr19:14•viminfodrwx--5lukasstaff19 Jun2023vscodedrwxr-xr-x@lukasstaff9620 Jan2025- warpdrwxr-xr-xlukasstaffdrwxr-xr-x@5 lukasstaff29Apr2023. wdm26Jan13:03windsurfdrwxr-xr-x4lukasstaff24 Mar12:03yarnlukasstaff-rw-r--r--@lukasstaff30Mar10:12•yarnrc6Apr14:31.zcompdump-rw-r--r--@lukasstaff2Nov20:34-rw-r--r--@lukasstaff9Apr20:30lukasstaff•zprofile-rw-r--r--8-rw-r--r--@lukasstaffApr2022zprofile-copy15Mar2023•zprofile.pysave-rw---lukasstaff29Jun2022.zprofile.save-rw-r--r--1lukasstaff8 Apr-rw--1 lukasstaff2022zprofilees11Apr 11:12drwx-----9 lukasstaff.zsh_history6 May2025zsh_sessions-rw-r--r--@1lukasstaffdrwx-----@9lukasstaff25Jul2025.zshrc9 Apr20:08Applicationsdrwxr-xr-xe2 lukasstaff6422 Oct09:35CascadeProjectsdrwxr-xr-x4 lukasstaff27Oct09:24DEVdrwx--@5 lukasstaff11Apr14:53Desktopdrwx-7 lukasstaff26Mar14:40Documentsdrwx--41 lukasstaff8Apr20:46Downloadsdrwxr-xr-xe4 lukasstaff17 Mar20:27drwx-112 lukasstaffKeychron_Screen2 Dec09:19drwx7 lukasstaffLibrary12Feb2024Moviesdrwx-5 lukasstaffdrwx9 lukasstaff25Sep2023Music25Sep2023Picturesdrwx-3 lukasstaff968 Nov2021Postmandrwx-4 lukasstaff28 Oct2021Public-rw-r-r--@1lukasstaff15 Dec09:16Untitled 4.spfdrwx-4 lukasstaff2Jul2023Usersdrwx-lukasstaff9630Sep2022iCloud Drive (Archive)drwx-16 lukasstaff3Novdrwxr-xr-x3 lukasstaff11:35jiminny9620Mar18:47node_modulesdrwxr-xr-x4 lukasstaff21 Oct18:15raycastlukasstaff1 Mar14:26-rwxr-xr-x1 lukasstaffresponse.bin382411Apr15:16screenpipe-day.sh-rw-r--r--1 lukasstaff8620 Mar18:47yarn. locklukas@Lukas-Kovaliks-MacBook-Pro-Jiminny$• *3-zsh• *4zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381-zshlhl• 85-zsh100% C• *6Sat 11 Apr 15:17:13-zshT81*7...
|
NULL
|
|
760
|
18
|
13
|
2026-04-11T12:17:14.991571+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909834991_m1.jpg...
|
NULL
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp-zshDOCKERdrwxr-xr-xdrwxr-xr-xdrwx-drwxr-xr-xedrwx--rw-drwx--drwxr-xr-x@drwxr-xr-xdrwxr-xr-x@drwxr-xr-xO ₴1DEV (-zsh)-О 882APP (-zsh)10 lukasstaff32011Apr 14:52screenpipe4 lukasstaff128Feb09:35sonarlint15lukasstaff4808Aug2025.sshlukasstaff9615Aug2025streamlitlukasstaff19217Oct2022swiftpmlukasstaff121838 Apr19:14•viminfolukasstaff16019Jun2023vscodelukasstaff9620 Jan2025- warplukasstaff5 lukasstaff12829Apr2023. wdm16026Jan13:03windsurf4lukasstaff12824 Mar12:03yarnlukasstaff116-rw-r--r--@-rw-r--r--@-rw-r--r--@-rw-r--r---rw-r--r--@-rW----rw-r--r---rw--drwx------rw-r--r--@drwx------@drwxr-xr-xedrwxr-xr-xdrwx--@drwx-drwx--drwxr-xr-xedrwx-drwx-drwx-drwxdrwx-drwx--rw-rdrwx-drwx-drwx-drwxr-xr-xdrwxr-xr-xlukasstaff30Mar10:12•yarnrc495186Apr14:31.zcompdumplukasstaff467582Nov20:34lukasstaff56419Apr20:30•zprofilelukasstaff14688Apr2022zprofile-copylukasstaff290015Mar2023•zprofile.pysavelukasstaff173129Jun2022.zprofile.save1lukasstaff1 lukasstaff15698 Apr2022•zprofilees2881311Apr 11:129 lukasstaff.zsh_history2886 May2025zsh_sessions1lukasstaff9lukasstaff36225Jul2025.zshrc2889 Apr20:08Applications2 lukasstaff6422 Oct09:35CascadeProjects4 lukasstaff12827Oct09:24DEV5 lukasstaff16011Apr14:53Desktop7 lukasstaff22426Mar14:40Documents41 lukasstaff13128Apr20:46Downloads4 lukasstaff112 lukasstaff12817 Mar20:27Keychron_Screen35842 Dec09:197 lukasstaffLibrary22412Feb2024Movies5 lukasstaff1609 lukasstaff25Sep2023Music28825Sep2023Pictures3 lukasstaff968 Nov2021Postman4 lukasstaff12828 Oct2021Publicr--@1lukasstaff395015 Dec09:16Untitled 4.spf4 lukasstaff1282Jul2023Userslukasstaff9630Sep2022iCloud Drive (Archive)16 lukasstaff3 lukasstaff5123Nov11:35jiminny9620Mar18:47node_modules4 lukasstaff12821 Oct18:15raycastlukasstaff1 Mar14:26-rwxr-xr-x1 lukasstaffresponse.bin382411 Apr15:16screenpipe-day.sh-rw-r--r--1 lukasstaff8620 Mar 18:47yarn.locklukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $• ₴з-zsh• 84zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381-zsh$0(ahl• ₴5-zsh100% <7O 886Sat 11 Apr 15:17:14-zsh181*7...
|
NULL
|
1873772543583741402
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp-zshDOCKERdrwxr-xr-xdrwxr-xr-xdrwx-drwxr-xr-xedrwx--rw-drwx--drwxr-xr-x@drwxr-xr-xdrwxr-xr-x@drwxr-xr-xO ₴1DEV (-zsh)-О 882APP (-zsh)10 lukasstaff32011Apr 14:52screenpipe4 lukasstaff128Feb09:35sonarlint15lukasstaff4808Aug2025.sshlukasstaff9615Aug2025streamlitlukasstaff19217Oct2022swiftpmlukasstaff121838 Apr19:14•viminfolukasstaff16019Jun2023vscodelukasstaff9620 Jan2025- warplukasstaff5 lukasstaff12829Apr2023. wdm16026Jan13:03windsurf4lukasstaff12824 Mar12:03yarnlukasstaff116-rw-r--r--@-rw-r--r--@-rw-r--r--@-rw-r--r---rw-r--r--@-rW----rw-r--r---rw--drwx------rw-r--r--@drwx------@drwxr-xr-xedrwxr-xr-xdrwx--@drwx-drwx--drwxr-xr-xedrwx-drwx-drwx-drwxdrwx-drwx--rw-rdrwx-drwx-drwx-drwxr-xr-xdrwxr-xr-xlukasstaff30Mar10:12•yarnrc495186Apr14:31.zcompdumplukasstaff467582Nov20:34lukasstaff56419Apr20:30•zprofilelukasstaff14688Apr2022zprofile-copylukasstaff290015Mar2023•zprofile.pysavelukasstaff173129Jun2022.zprofile.save1lukasstaff1 lukasstaff15698 Apr2022•zprofilees2881311Apr 11:129 lukasstaff.zsh_history2886 May2025zsh_sessions1lukasstaff9lukasstaff36225Jul2025.zshrc2889 Apr20:08Applications2 lukasstaff6422 Oct09:35CascadeProjects4 lukasstaff12827Oct09:24DEV5 lukasstaff16011Apr14:53Desktop7 lukasstaff22426Mar14:40Documents41 lukasstaff13128Apr20:46Downloads4 lukasstaff112 lukasstaff12817 Mar20:27Keychron_Screen35842 Dec09:197 lukasstaffLibrary22412Feb2024Movies5 lukasstaff1609 lukasstaff25Sep2023Music28825Sep2023Pictures3 lukasstaff968 Nov2021Postman4 lukasstaff12828 Oct2021Publicr--@1lukasstaff395015 Dec09:16Untitled 4.spf4 lukasstaff1282Jul2023Userslukasstaff9630Sep2022iCloud Drive (Archive)16 lukasstaff3 lukasstaff5123Nov11:35jiminny9620Mar18:47node_modules4 lukasstaff12821 Oct18:15raycastlukasstaff1 Mar14:26-rwxr-xr-x1 lukasstaffresponse.bin382411 Apr15:16screenpipe-day.sh-rw-r--r--1 lukasstaff8620 Mar 18:47yarn.locklukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $• ₴з-zsh• 84zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381-zsh$0(ahl• ₴5-zsh100% <7O 886Sat 11 Apr 15:17:14-zsh181*7...
|
759
|
|
761
|
18
|
14
|
2026-04-11T12:17:15.797292+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909835797_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 162888
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .
drwx------+ 89 lukas staff 2848 11 Apr 15:16 ..
-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json
drwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data
-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite
-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm
-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls
Applications Documents Movies Public jiminny screenpipe-day.sh
CascadeProjects Downloads Music Untitled 4.spf node_modules yarn.lock
DEV Keychron_Screen Pictures Users raycast
Desktop Library Postman iCloud Drive (Archive) response.bin
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 15:16 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 9 Apr 18:24 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 9 lukas staff 288 11 Apr 14:52 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 162888\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 ..\n-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json\ndrwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data\n-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls\nApplications\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDocuments\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMovies\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPublic\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tjiminny\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe-day.sh\nCascadeProjects\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDownloads\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMusic\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUntitled 4.spf\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tnode_modules\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tyarn.lock\nDEV\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tKeychron_Screen\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPictures\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUsers\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traycast\nDesktop\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tLibrary\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPostman\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tiCloud Drive (Archive)\u0000\tresponse.bin\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 9 Apr 18:24 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 9 lukas staff 288 11 Apr 14:52 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 162888\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 ..\n-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json\ndrwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data\n-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls\nApplications\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDocuments\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMovies\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPublic\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tjiminny\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe-day.sh\nCascadeProjects\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDownloads\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMusic\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUntitled 4.spf\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tnode_modules\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tyarn.lock\nDEV\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tKeychron_Screen\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPictures\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUsers\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traycast\nDesktop\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tLibrary\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPostman\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tiCloud Drive (Archive)\u0000\tresponse.bin\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 9 Apr 18:24 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 9 lukas staff 288 11 Apr 14:52 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48819444,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
-8664222300600007459
|
7955072120078387748
|
click
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 162888
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .
drwx------+ 89 lukas staff 2848 11 Apr 15:16 ..
-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json
drwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data
-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite
-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm
-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls
Applications Documents Movies Public jiminny screenpipe-day.sh
CascadeProjects Downloads Music Untitled 4.spf node_modules yarn.lock
DEV Keychron_Screen Pictures Users raycast
Desktop Library Postman iCloud Drive (Archive) response.bin
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 15:16 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 9 Apr 18:24 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 9 lukas staff 288 11 Apr 14:52 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
762
|
18
|
15
|
2026-04-11T12:17:18.002381+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-11/1775 /Users/lukas/.screenpipe/data/data/2026-04-11/1775909838002_m1.jpg...
|
iTerm2
|
zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 162888
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .
drwx------+ 89 lukas staff 2848 11 Apr 15:16 ..
-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json
drwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data
-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite
-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm
-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls
Applications Documents Movies Public jiminny screenpipe-day.sh
CascadeProjects Downloads Music Untitled 4.spf node_modules yarn.lock
DEV Keychron_Screen Pictures Users raycast
Desktop Library Postman iCloud Drive (Archive) response.bin
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 15:16 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 9 Apr 18:24 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 9 lukas staff 288 11 Apr 14:52 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ~/screenpipe-day.sh 2026-04-09
═══════════════════════════════════════
SCREENPIPE REPORT — 2026-04-09
═══════════════════════════════════════
📱 APP USAGE (frames + estimated time)
───────────────────────────────────────
iTerm2 185 frames ~ 13.9 min
Dia 31 frames ~ 2.3 min
Safari 20 frames ~ 1.5 min
Claude 12 frames ~ 0.9 min
UserNotificationCenter 4 frames ~ 0.3 min
Control Centre 3 frames ~ 0.2 min
Slack 2 frames ~ 0.1 min
Activity Monitor 2 frames ~ 0.1 min
Finder 1 frames ~ 0.1 min
⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)
───────────────────────────────────────
iTerm2 clicks:283 keys:122 switches:34
Dia clicks:171 keys:56 switches:9
Safari clicks:56 keys:11 switches:3
Claude clicks:50 keys:6 switches:9
UserNotificationCenter clicks:8 keys:0 switches:4
Slack clicks:1 keys:0 switches:1
🌐 BROWSER URLS VISITED
───────────────────────────────────────
13 frames [URL_WITH_CREDENTIALS] ~ $ claude mcp add screenpipe -- npx -y
Dia lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y
npm install -g @anthropic-ai/claude-code
npm install -g @anthropic-ai/claude-code
Dia npm install -g @anthropic-ai/claude-code
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
Dia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
Dia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
Dia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y
npm install -g @anthropic-ai/claude-code
Dia npm install -g @anthropic-ai/claude-code
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
Dia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
iTerm2 curl [URL_WITH_CREDENTIALS] ~ $ curl [URL_WITH_CREDENTIALS] ~ $ curl [URL_WITH_CREDENTIALS] ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
zsh
Close Tab
⌥⌘1
zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 162888\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 ..\n-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json\ndrwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data\n-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls\nApplications\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDocuments\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMovies\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPublic\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tjiminny\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe-day.sh\nCascadeProjects\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDownloads\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMusic\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUntitled 4.spf\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tnode_modules\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tyarn.lock\nDEV\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tKeychron_Screen\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPictures\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUsers\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traycast\nDesktop\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tLibrary\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPostman\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tiCloud Drive (Archive)\u0000\tresponse.bin\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 9 Apr 18:24 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 9 lukas staff 288 11 Apr 14:52 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ~/screenpipe-day.sh 2026-04-09\n═══════════════════════════════════════\n SCREENPIPE REPORT — 2026-04-09\n═══════════════════════════════════════\n\n📱\u0000 APP USAGE (frames + estimated time)\n───────────────────────────────────────\niTerm2 185 frames ~ 13.9 min\nDia 31 frames ~ 2.3 min\nSafari 20 frames ~ 1.5 min\nClaude 12 frames ~ 0.9 min\nUserNotificationCenter 4 frames ~ 0.3 min\nControl Centre 3 frames ~ 0.2 min\nSlack 2 frames ~ 0.1 min\nActivity Monitor 2 frames ~ 0.1 min\nFinder 1 frames ~ 0.1 min\n\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\n───────────────────────────────────────\niTerm2 clicks:283 keys:122 switches:34 \nDia clicks:171 keys:56 switches:9 \nSafari clicks:56 keys:11 switches:3 \nClaude clicks:50 keys:6 switches:9 \nUserNotificationCenter clicks:8 keys:0 switches:4 \nSlack clicks:1 keys:0 switches:1 \n\n🌐\u0000 BROWSER URLS VISITED\n───────────────────────────────────────\n 13 frames https://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21\n 4 frames https://location-tracker.lakylak.xyz/dashboard\n 2 frames https://nas.lakylak.xyz/desktop/?os=ugospro#/\n 1 frames https://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b\n\n🪟\u0000 WINDOW TITLES (top 20)\n───────────────────────────────────────\niTerm2 93 -zsh\niTerm2 34 screenpipe\"\nSafari 13 Order Room Service • HBO Max\nClaude 12 Claude\niTerm2 8 ✳ Find cheapest WD Red Plus 6TB price\nDia 7 Personal: New Tab\niTerm2 7 ✳ Claude Code\niTerm2 7 ⠂ Find cheapest WD Red Plus 6TB price\niTerm2 7 ⠂ Research Western Digital Red Plus pricing\niTerm2 7 ⠐ Research Western Digital Red Plus pricing\nDia 6 Personal: GitHub - scree…\niTerm2 5 ✳ Research Western Digital Red Plus pricing\nSafari 4 Location Logger\nUserNotificationCenter 4 \niTerm2 4 nano\niTerm2 4 ⠐ Find cheapest WD Red Plus 6TB price\nControl Centre 3 Control Centre\nDia 3 Personal: Western Digita…\niTerm2 3 ✳ Check today's app usage\nActivity Monitor 2 Activity Monitor – All Processes\n\n🕐\u0000 HOURLY TIMELINE\n───────────────────────────────────────\n16:00 iTerm2 14 frames\n16:00 Safari 4 frames\n16:00 Dia 3 frames\n16:00 Control Centre 2 frames\n16:00 Activity Monitor 2 frames\n17:00 iTerm2 116 frames\n17:00 Dia 24 frames\n17:00 Safari 16 frames\n17:00 Claude 8 frames\n17:00 UserNotificationCenter 4 frames\n17:00 Finder 1 frames\n17:00 Control Centre 1 frames\n18:00 iTerm2 55 frames\n18:00 Dia 4 frames\n18:00 Claude 4 frames\n18:00 Slack 2 frames\n\n📋\u0000 CLIPBOARD ACTIVITY\n───────────────────────────────────────\niTerm2 claude mcp add screenpipe -- npx -y screenpipe-mcp\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y\nDia lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y\n npm install -g @anthropic-ai/claude-code\n npm install -g @anthropic-ai/claude-code\nDia npm install -g @anthropic-ai/claude-code\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y\n claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\nDia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\nDia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\nDia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y\n npm install -g @anthropic-ai/claude-code\nDia npm install -g @anthropic-ai/claude-code\n claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\n claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\nDia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\niTerm2 curl http://localhost:3030/health\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl http://localhost:3030/health\n{\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl http://localhost:3030/health\n{\n\n💬\u0000 OCR TEXT SAMPLES PER APP\n───────────────────────────────────────\n iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(io]100% C8Thu 9 Apr 19:53:14\n\n🔢\u0000 TOTALS\n───────────────────────────────────────\nFrames: 523\nUI Events: 1305\nOCR texts: 271\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"value":")\n/* frames_fts(full_text,app_name,window_name,browser_url,id) */;\nCREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;\nCREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);\nCREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);\nCREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;\nCREATE TRIGGER frames_ai AFTER INSERT ON frames\nWHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''\nBEGIN\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n VALUES (\n NEW.id,\n NEW.full_text,\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n );\nEND;\nCREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\n INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)\n SELECT\n NEW.id,\n COALESCE(NEW.full_text, ''),\n COALESCE(NEW.app_name, ''),\n COALESCE(NEW.window_name, ''),\n COALESCE(NEW.browser_url, '')\n WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';\nEND;\nCREATE TRIGGER frames_ad AFTER DELETE ON frames\nBEGIN\n DELETE FROM frames_fts WHERE id = OLD.id;\nEND;\nCREATE INDEX idx_memories_frame_id ON memories(frame_id);\nCREATE INDEX idx_elements_source_role_text\n ON elements(source, role, frame_id)\n WHERE text IS NOT NULL;\nCREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;\nCREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);\"\n2026-04-09|523\n2026-04-11|197\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name\nORDER BY frames DESC;\n\"\niTerm2|185|13.9\nDia|31|2.3\nSafari|20|1.5\nClaude|12|0.9\nUserNotificationCenter|4|0.3\nControl Centre|3|0.2\nSlack|2|0.1\nActivity Monitor|2|0.1\nFinder|1|0.1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT browser_url, COUNT(*) as frames\nFROM frames\nWHERE date(timestamp) = date('now', '-2 day')\nAND browser_url IS NOT NULL\nGROUP BY browser_url\nORDER BY frames DESC\nLIMIT 20;\n\"\nhttps://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21|13\nhttps://location-tracker.lakylak.xyz/dashboard|4\nhttps://nas.lakylak.xyz/desktop/?os=ugospro#/|2\nhttps://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite \"\nSELECT app_name, event_type, COUNT(*) as events\nFROM ui_events\nWHERE date(timestamp) = date('now', '-2 day')\nAND app_name IS NOT NULL\nGROUP BY app_name, event_type\nORDER BY events DESC\nLIMIT 30;\n\"\niTerm2|click|283\nDia|click|171\niTerm2|key|122\nDia|key|56\nSafari|click|56\nClaude|click|50\niTerm2|app_switch|34\nDia|clipboard|17\nSafari|key|11\nClaude|app_switch|9\nDia|app_switch|9\nUserNotificationCenter|click|8\nClaude|key|6\niTerm2|clipboard|6\nUserNotificationCenter|app_switch|4\nSafari|app_switch|3\nSlack|app_switch|1\nSlack|click|1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >.... \nWHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL\nGROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;\"\n\necho \"\\n🕐\u0000 HOURLY TIMELINE\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))\nFROM frames\nWHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL\nGROUP BY strftime('%H', timestamp), app_name\nORDER BY strftime('%H', timestamp), COUNT(*) DESC;\"\n\necho \"\\n📋\u0000 CLIPBOARD ACTIVITY\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))\nFROM ui_events\nWHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL\nORDER BY timestamp LIMIT 20;\"\n\necho \"\\n💬\u0000 OCR TEXT SAMPLES PER APP\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))\nFROM ocr_text o\nJOIN frames f ON o.frame_id = f.id\nWHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''\nGROUP BY o.app_name\nORDER BY o.app_name LIMIT 15;\"\n\necho \"\\n🔢\u0000 TOTALS\"\necho \"───────────────────────────────────────\"\nsqlite3 \"$DB\" \"\nSELECT\n 'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';\n\"\nsqlite3 \"$DB\" \"\nSELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';\n\"\nEOF\nchmod +x ~/screenpipe-day.sh\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll \ntotal 162888\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 ..\n-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json\ndrwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data\n-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite\n-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm\n-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal\ndrwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls\nApplications\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDocuments\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMovies\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPublic\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tjiminny\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tscreenpipe-day.sh\nCascadeProjects\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tDownloads\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tMusic\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUntitled 4.spf\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tnode_modules\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tyarn.lock\nDEV\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tKeychron_Screen\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPictures\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tUsers\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traycast\nDesktop\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tLibrary\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tPostman\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tiCloud Drive (Archive)\u0000\tresponse.bin\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll\ntotal 1272\ndrwx------+ 89 lukas staff 2848 11 Apr 15:16 .\ndrwxr-xr-x 5 root admin 160 23 Aug 2024 ..\n-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding\n-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store\ndrwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash\ndrwx------ 5 lukas staff 160 1 Nov 2021 .aws\n-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json\n-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc\ndrwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito\ndrwx------@ 6 lukas staff 192 9 Apr 19:53 .cache\ndrwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude\n-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json\ndrwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium\ndrwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer\ndrwx------ 16 lukas staff 512 21 May 2025 .config\ndrwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue\ndrwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot\ndrwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor\ndrwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor\ndrwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona\ndrwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb\ndrwx------ 24 lukas staff 768 9 Apr 18:24 .docker\ndrwx------ 15 lukas staff 480 6 Jun 2023 .dropbox\ndrwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak\n-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth\n-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig\n-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp\ndrwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon\ndrwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc\n-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst\ndrwx------ 5 lukas staff 160 23 Dec 2024 .local\n-rw------- 1 lukas staff 204 16 Mar 2024 .netrc\ndrwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp\n-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history\n-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer\ndrwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py\ndrwx------ 9 lukas staff 288 11 Apr 14:52 .npm\n-rw------- 1 lukas staff 74 20 May 2024 .npmrc\ndrwx------ 32 lukas staff 1024 25 Jul 2025 .nvm\ndrwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman\n-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile\n-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history\ndrwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode\ndrwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight\ndrwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe\ndrwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint\ndrwx------ 15 lukas staff 480 8 Aug 2025 .ssh\ndrwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit\ndrwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm\n-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo\ndrwx------ 5 lukas staff 160 19 Jun 2023 .vscode\ndrwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp\ndrwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm\ndrwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf\ndrwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn\n-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc\n-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump\n-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381\n-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile\n-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy\n-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave\n-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save\n-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees\n-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history\ndrwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions\n-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc\ndrwx------@ 9 lukas staff 288 9 Apr 20:08 Applications\ndrwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects\ndrwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV\ndrwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop\ndrwx------@ 7 lukas staff 224 26 Mar 14:40 Documents\ndrwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads\ndrwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen\ndrwx------@ 112 lukas staff 3584 2 Dec 09:19 Library\ndrwx------ 7 lukas staff 224 12 Feb 2024 Movies\ndrwx------+ 5 lukas staff 160 25 Sep 2023 Music\ndrwx------+ 9 lukas staff 288 25 Sep 2023 Pictures\ndrwx------ 3 lukas staff 96 8 Nov 2021 Postman\ndrwx------+ 4 lukas staff 128 28 Oct 2021 Public\n-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf\ndrwx------ 4 lukas staff 128 2 Jul 2023 Users\ndrwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)\ndrwx------ 16 lukas staff 512 3 Nov 11:35 jiminny\ndrwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules\ndrwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast\n-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin\n-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh\n-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ~/screenpipe-day.sh 2026-04-09\n═══════════════════════════════════════\n SCREENPIPE REPORT — 2026-04-09\n═══════════════════════════════════════\n\n📱\u0000 APP USAGE (frames + estimated time)\n───────────────────────────────────────\niTerm2 185 frames ~ 13.9 min\nDia 31 frames ~ 2.3 min\nSafari 20 frames ~ 1.5 min\nClaude 12 frames ~ 0.9 min\nUserNotificationCenter 4 frames ~ 0.3 min\nControl Centre 3 frames ~ 0.2 min\nSlack 2 frames ~ 0.1 min\nActivity Monitor 2 frames ~ 0.1 min\nFinder 1 frames ~ 0.1 min\n\n⌨️\u0000 ACTIVITY TYPE PER APP (clicks / keys / switches)\n───────────────────────────────────────\niTerm2 clicks:283 keys:122 switches:34 \nDia clicks:171 keys:56 switches:9 \nSafari clicks:56 keys:11 switches:3 \nClaude clicks:50 keys:6 switches:9 \nUserNotificationCenter clicks:8 keys:0 switches:4 \nSlack clicks:1 keys:0 switches:1 \n\n🌐\u0000 BROWSER URLS VISITED\n───────────────────────────────────────\n 13 frames https://play.hbomax.com/video/watch/16b35e6c-e745-4416-bc16-0ef5092ba4e0/07b58730-24cb-419c-b5a0-1e258a77cd21\n 4 frames https://location-tracker.lakylak.xyz/dashboard\n 2 frames https://nas.lakylak.xyz/desktop/?os=ugospro#/\n 1 frames https://play.hbomax.com/show/06f986dd-dd6a-4596-9a0a-f473ef99c64b\n\n🪟\u0000 WINDOW TITLES (top 20)\n───────────────────────────────────────\niTerm2 93 -zsh\niTerm2 34 screenpipe\"\nSafari 13 Order Room Service • HBO Max\nClaude 12 Claude\niTerm2 8 ✳ Find cheapest WD Red Plus 6TB price\nDia 7 Personal: New Tab\niTerm2 7 ✳ Claude Code\niTerm2 7 ⠂ Find cheapest WD Red Plus 6TB price\niTerm2 7 ⠂ Research Western Digital Red Plus pricing\niTerm2 7 ⠐ Research Western Digital Red Plus pricing\nDia 6 Personal: GitHub - scree…\niTerm2 5 ✳ Research Western Digital Red Plus pricing\nSafari 4 Location Logger\nUserNotificationCenter 4 \niTerm2 4 nano\niTerm2 4 ⠐ Find cheapest WD Red Plus 6TB price\nControl Centre 3 Control Centre\nDia 3 Personal: Western Digita…\niTerm2 3 ✳ Check today's app usage\nActivity Monitor 2 Activity Monitor – All Processes\n\n🕐\u0000 HOURLY TIMELINE\n───────────────────────────────────────\n16:00 iTerm2 14 frames\n16:00 Safari 4 frames\n16:00 Dia 3 frames\n16:00 Control Centre 2 frames\n16:00 Activity Monitor 2 frames\n17:00 iTerm2 116 frames\n17:00 Dia 24 frames\n17:00 Safari 16 frames\n17:00 Claude 8 frames\n17:00 UserNotificationCenter 4 frames\n17:00 Finder 1 frames\n17:00 Control Centre 1 frames\n18:00 iTerm2 55 frames\n18:00 Dia 4 frames\n18:00 Claude 4 frames\n18:00 Slack 2 frames\n\n📋\u0000 CLIPBOARD ACTIVITY\n───────────────────────────────────────\niTerm2 claude mcp add screenpipe -- npx -y screenpipe-mcp\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y\nDia lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y\n npm install -g @anthropic-ai/claude-code\n npm install -g @anthropic-ai/claude-code\nDia npm install -g @anthropic-ai/claude-code\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y\n claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\nDia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\nDia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\nDia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y\n npm install -g @anthropic-ai/claude-code\nDia npm install -g @anthropic-ai/claude-code\n claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\n claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\nDia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc\niTerm2 curl http://localhost:3030/health\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl http://localhost:3030/health\n{\n lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ curl http://localhost:3030/health\n{\n\n💬\u0000 OCR TEXT SAMPLES PER APP\n───────────────────────────────────────\n iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(io]100% C8Thu 9 Apr 19:53:14\n\n🔢\u0000 TOTALS\n───────────────────────────────────────\nFrames: 523\nUI Events: 1305\nOCR texts: 271\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"zsh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"zsh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"role_description":"text"}]...
|
3800978459205822800
|
5648665543643950756
|
visual_change
|
accessibility
|
NULL
|
)
/* frames_fts(full_text,app_name,window_name,bro )
/* frames_fts(full_text,app_name,window_name,browser_url,id) */;
CREATE TABLE IF NOT EXISTS 'frames_fts_data'(id INTEGER PRIMARY KEY, block BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;
CREATE TABLE IF NOT EXISTS 'frames_fts_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4);
CREATE TABLE IF NOT EXISTS 'frames_fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB);
CREATE TABLE IF NOT EXISTS 'frames_fts_config'(k PRIMARY KEY, v) WITHOUT ROWID;
CREATE TRIGGER frames_ai AFTER INSERT ON frames
WHEN NEW.full_text IS NOT NULL AND NEW.full_text != ''
BEGIN
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
VALUES (
NEW.id,
NEW.full_text,
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
);
END;
CREATE TRIGGER frames_au AFTER UPDATE OF full_text, app_name, window_name, browser_url ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
INSERT INTO frames_fts(id, full_text, app_name, window_name, browser_url)
SELECT
NEW.id,
COALESCE(NEW.full_text, ''),
COALESCE(NEW.app_name, ''),
COALESCE(NEW.window_name, ''),
COALESCE(NEW.browser_url, '')
WHERE NEW.full_text IS NOT NULL AND NEW.full_text != '';
END;
CREATE TRIGGER frames_ad AFTER DELETE ON frames
BEGIN
DELETE FROM frames_fts WHERE id = OLD.id;
END;
CREATE INDEX idx_memories_frame_id ON memories(frame_id);
CREATE INDEX idx_elements_source_role_text
ON elements(source, role, frame_id)
WHERE text IS NOT NULL;
CREATE INDEX idx_frames_sync_id ON frames(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_ocr_text_sync_id ON ocr_text(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_audio_transcriptions_sync_id ON audio_transcriptions(sync_id) WHERE sync_id IS NOT NULL;
CREATE INDEX idx_elements_frame_source_role ON elements(frame_id, source, role) WHERE text IS NOT NULL;
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "SELECT date(timestamp), COUNT(*) as frames FROM frames GROUP BY date(timestamp) ORDER BY date(timestamp);"
2026-04-09|523
2026-04-11|197
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, COUNT(*) as frames, ROUND(COUNT(*) * 4.5 / 60.0, 1) as est_minutes
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name
ORDER BY frames DESC;
"
iTerm2|185|13.9
Dia|31|2.3
Safari|20|1.5
Claude|12|0.9
UserNotificationCenter|4|0.3
Control Centre|3|0.2
Slack|2|0.1
Activity Monitor|2|0.1
Finder|1|0.1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT browser_url, COUNT(*) as frames
FROM frames
WHERE date(timestamp) = date('now', '-2 day')
AND browser_url IS NOT NULL
GROUP BY browser_url
ORDER BY frames DESC
LIMIT 20;
"
[URL_WITH_CREDENTIALS] ~/.screenpipe $ sqlite3 ~/.screenpipe/db.sqlite "
SELECT app_name, event_type, COUNT(*) as events
FROM ui_events
WHERE date(timestamp) = date('now', '-2 day')
AND app_name IS NOT NULL
GROUP BY app_name, event_type
ORDER BY events DESC
LIMIT 30;
"
iTerm2|click|283
Dia|click|171
iTerm2|key|122
Dia|key|56
Safari|click|56
Claude|click|50
iTerm2|app_switch|34
Dia|clipboard|17
Safari|key|11
Claude|app_switch|9
Dia|app_switch|9
UserNotificationCenter|click|8
Claude|key|6
iTerm2|clipboard|6
UserNotificationCenter|app_switch|4
Safari|app_switch|3
Slack|app_switch|1
Slack|click|1
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ >....
WHERE date(timestamp) = '$DATE' AND window_name IS NOT NULL AND app_name IS NOT NULL
GROUP BY app_name, window_name ORDER BY COUNT(*) DESC LIMIT 20;"
echo "\n🕐 HOURLY TIMELINE"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%s %-20s %3d frames', strftime('%H:00', timestamp), app_name, COUNT(*))
FROM frames
WHERE date(timestamp) = '$DATE' AND app_name IS NOT NULL
GROUP BY strftime('%H', timestamp), app_name
ORDER BY strftime('%H', timestamp), COUNT(*) DESC;"
echo "\n📋 CLIPBOARD ACTIVITY"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-20s %s', app_name, SUBSTR(text_content, 1, 80))
FROM ui_events
WHERE date(timestamp) = '$DATE' AND event_type = 'clipboard' AND text_content IS NOT NULL
ORDER BY timestamp LIMIT 20;"
echo "\n💬 OCR TEXT SAMPLES PER APP"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT printf('%-15s %s', o.app_name, SUBSTR(o.text, 1, 80))
FROM ocr_text o
JOIN frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$DATE' AND o.app_name IS NOT NULL AND o.text != ''
GROUP BY o.app_name
ORDER BY o.app_name LIMIT 15;"
echo "\n🔢 TOTALS"
echo "───────────────────────────────────────"
sqlite3 "$DB" "
SELECT
'Frames: ' || COUNT(*) FROM frames WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'UI Events: ' || COUNT(*) FROM ui_events WHERE date(timestamp) = '$DATE';
"
sqlite3 "$DB" "
SELECT 'OCR texts: ' || COUNT(*) FROM ocr_text o JOIN frames f ON o.frame_id = f.id WHERE date(f.timestamp) = '$DATE';
"
EOF
chmod +x ~/screenpipe-day.sh
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ll
total 162888
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .
drwx------+ 89 lukas staff 2848 11 Apr 15:16 ..
-rw-r--r-- 1 lukas staff 270 9 Apr 20:27 config.json
drwxr-xr-x 5 lukas staff 160 11 Apr 15:03 data
-rw-r--r-- 1 lukas staff 73764864 11 Apr 15:12 db.sqlite
-rw-r--r-- 1 lukas staff 32768 11 Apr 14:52 db.sqlite-shm
-rw-r--r-- 1 lukas staff 8742672 11 Apr 15:16 db.sqlite-wal
drwxr-xr-x 8 lukas staff 256 9 Apr 19: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 17246 11 Apr 15:16 screenpipe.2026-04-11.0.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ cd ..
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ls
Applications Documents Movies Public jiminny screenpipe-day.sh
CascadeProjects Downloads Music Untitled 4.spf node_modules yarn.lock
DEV Keychron_Screen Pictures Users raycast
Desktop Library Postman iCloud Drive (Archive) response.bin
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ll
total 1272
drwx------+ 89 lukas staff 2848 11 Apr 15:16 .
drwxr-xr-x 5 root admin 160 23 Aug 2024 ..
-r-------- 1 lukas staff 7 18 Nov 2021 .CFUserTextEncoding
-rw-r--r--@ 1 lukas staff 22532 11 Apr 11:15 .DS_Store
drwx------+ 2 lukas staff 64 11 Apr 11:15 .Trash
drwx------ 5 lukas staff 160 1 Nov 2021 .aws
-rw-r--r-- 1 lukas staff 341470 29 Sep 2022 .babel.json
-rw-------@ 1 lukas staff 388 25 Jul 2025 .bash_history
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .bashrc
drwxr-xr-x 5 lukas staff 160 11 Mar 2023 .bito
drwx------@ 6 lukas staff 192 9 Apr 19:53 .cache
drwxr-xr-x 20 lukas staff 640 9 Apr 21:21 .claude
-rw------- 1 lukas staff 24973 9 Apr 21:24 .claude.json
drwxr-xr-x@ 20 lukas staff 640 12 Mar 09:12 .codeium
drwxrwxrwx@ 3 lukas staff 96 2 Mar 2023 .composer
drwx------ 16 lukas staff 512 21 May 2025 .config
drwxr-xr-x 15 lukas staff 480 23 Dec 2024 .continue
drwx------@ 3 lukas staff 96 16 Feb 19:13 .copilot
drwxr-xr-x@ 5 lukas staff 160 9 Apr 2025 .cursor
drwxr-xr-x@ 5 lukas staff 160 17 Aug 2024 .cursor-tutor
drwxr-xr-x 3 lukas staff 96 8 Sep 2024 .daytona
drwxr-xr-x@ 4 lukas staff 128 18 Feb 10:52 .devdb
drwx------ 24 lukas staff 768 9 Apr 18:24 .docker
drwx------ 15 lukas staff 480 6 Jun 2023 .dropbox
drwxr-xr-x@ 3 lukas staff 96 20 Nov 2022 .fig.dotfiles.bak
-rw-r--r-- 1 lukas staff 138 5 Mar 2022 .gauth
-rw-r--r-- 1 lukas staff 220 25 Nov 2021 .gitconfig
-rw-r--r-- 1 lukas staff 12288 25 Nov 2021 .gitconfig.swp
drwx------ 5 lukas staff 160 18 Nov 2021 .hammerspoon
drwxr-xr-x 3 lukas staff 96 21 Mar 2025 .idlerc
-rw------- 1 lukas staff 20 31 Mar 18:32 .lesshst
drwx------ 5 lukas staff 160 23 Dec 2024 .local
-rw------- 1 lukas staff 204 16 Mar 2024 .netrc
drwx------ 3 lukas staff 96 1 Nov 2021 .node-gyp
-rw------- 1 lukas staff 4 6 Feb 2024 .node_repl_history
-rw-r--r-- 1 lukas staff 17 24 Dec 2023 .notion-enhancer
drwxr-xr-x 4 lukas staff 128 12 Jul 2024 .notion-py
drwx------ 9 lukas staff 288 11 Apr 14:52 .npm
-rw------- 1 lukas staff 74 20 May 2024 .npmrc
drwx------ 32 lukas staff 1024 25 Jul 2025 .nvm
drwxr-xr-x 4 lukas staff 128 5 Aug 2023 .postman
-rw-r--r--@ 1 lukas staff 77 9 Feb 2023 .profile
-rw-------@ 1 lukas staff 3153 21 Mar 2025 .python_history
drwx------ 2 lukas staff 64 15 Nov 2021 .quicktype-vscode
drwxr-xr-x@ 8 lukas staff 256 16 Feb 08:48 .redis-insight
drwxr-xr-x 10 lukas staff 320 11 Apr 14:52 .screenpipe
drwxr-xr-x 4 lukas staff 128 4 Feb 09:35 .sonarlint
drwx------ 15 lukas staff 480 8 Aug 2025 .ssh
drwxr-xr-x@ 3 lukas staff 96 15 Aug 2025 .streamlit
drwx------ 6 lukas staff 192 17 Oct 2022 .swiftpm
-rw------- 1 lukas staff 12183 8 Apr 19:14 .viminfo
drwx------ 5 lukas staff 160 19 Jun 2023 .vscode
drwxr-xr-x@ 3 lukas staff 96 20 Jan 2025 .warp
drwxr-xr-x 4 lukas staff 128 29 Apr 2023 .wdm
drwxr-xr-x@ 5 lukas staff 160 26 Jan 13:03 .windsurf
drwxr-xr-x 4 lukas staff 128 24 Mar 12:03 .yarn
-rw-r--r-- 1 lukas staff 116 30 Mar 10:12 .yarnrc
-rw-r--r--@ 1 lukas staff 49518 6 Apr 14:31 .zcompdump
-rw-r--r--@ 1 lukas staff 46758 2 Nov 20:34 .zcompdump.Lukas-Kovaliks-MacBook-Pro-Jiminny.23381
-rw-r--r--@ 1 lukas staff 5641 9 Apr 20:30 .zprofile
-rw-r--r-- 1 lukas staff 1468 8 Apr 2022 .zprofile-copy
-rw-r--r--@ 1 lukas staff 2900 15 Mar 2023 .zprofile.pysave
-rw------- 1 lukas staff 1731 29 Jun 2022 .zprofile.save
-rw-r--r-- 1 lukas staff 1569 8 Apr 2022 .zprofilees
-rw------- 1 lukas staff 28813 11 Apr 11:12 .zsh_history
drwx------ 9 lukas staff 288 6 May 2025 .zsh_sessions
-rw-r--r--@ 1 lukas staff 362 25 Jul 2025 .zshrc
drwx------@ 9 lukas staff 288 9 Apr 20:08 Applications
drwxr-xr-x@ 2 lukas staff 64 22 Oct 09:35 CascadeProjects
drwxr-xr-x 4 lukas staff 128 27 Oct 09:24 DEV
drwx------@ 5 lukas staff 160 11 Apr 14:53 Desktop
drwx------@ 7 lukas staff 224 26 Mar 14:40 Documents
drwx------@ 41 lukas staff 1312 8 Apr 20:46 Downloads
drwxr-xr-x@ 4 lukas staff 128 17 Mar 20:27 Keychron_Screen
drwx------@ 112 lukas staff 3584 2 Dec 09:19 Library
drwx------ 7 lukas staff 224 12 Feb 2024 Movies
drwx------+ 5 lukas staff 160 25 Sep 2023 Music
drwx------+ 9 lukas staff 288 25 Sep 2023 Pictures
drwx------ 3 lukas staff 96 8 Nov 2021 Postman
drwx------+ 4 lukas staff 128 28 Oct 2021 Public
-rw-r--r--@ 1 lukas staff 3950 15 Dec 09:16 Untitled 4.spf
drwx------ 4 lukas staff 128 2 Jul 2023 Users
drwx------ 3 lukas staff 96 30 Sep 2022 iCloud Drive (Archive)
drwx------ 16 lukas staff 512 3 Nov 11:35 jiminny
drwxr-xr-x 3 lukas staff 96 20 Mar 18:47 node_modules
drwxr-xr-x 4 lukas staff 128 21 Oct 18:15 raycast
-rw-r--r-- 1 lukas staff 0 1 Mar 14:26 response.bin
-rwxr-xr-x 1 lukas staff 3824 11 Apr 15:16 screenpipe-day.sh
-rw-r--r-- 1 lukas staff 86 20 Mar 18:47 yarn.lock
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ ~/screenpipe-day.sh 2026-04-09
═══════════════════════════════════════
SCREENPIPE REPORT — 2026-04-09
═══════════════════════════════════════
📱 APP USAGE (frames + estimated time)
───────────────────────────────────────
iTerm2 185 frames ~ 13.9 min
Dia 31 frames ~ 2.3 min
Safari 20 frames ~ 1.5 min
Claude 12 frames ~ 0.9 min
UserNotificationCenter 4 frames ~ 0.3 min
Control Centre 3 frames ~ 0.2 min
Slack 2 frames ~ 0.1 min
Activity Monitor 2 frames ~ 0.1 min
Finder 1 frames ~ 0.1 min
⌨️ ACTIVITY TYPE PER APP (clicks / keys / switches)
───────────────────────────────────────
iTerm2 clicks:283 keys:122 switches:34
Dia clicks:171 keys:56 switches:9
Safari clicks:56 keys:11 switches:3
Claude clicks:50 keys:6 switches:9
UserNotificationCenter clicks:8 keys:0 switches:4
Slack clicks:1 keys:0 switches:1
🌐 BROWSER URLS VISITED
───────────────────────────────────────
13 frames [URL_WITH_CREDENTIALS] ~ $ claude mcp add screenpipe -- npx -y
Dia lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y
npm install -g @anthropic-ai/claude-code
npm install -g @anthropic-ai/claude-code
Dia npm install -g @anthropic-ai/claude-code
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
Dia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
Dia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
Dia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ claude mcp add screenpipe -- npx -y
npm install -g @anthropic-ai/claude-code
Dia npm install -g @anthropic-ai/claude-code
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
Dia claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mc
iTerm2 curl [URL_WITH_CREDENTIALS] ~ $ curl [URL_WITH_CREDENTIALS] ~ $ curl [URL_WITH_CREDENTIALS] ~ $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
-zsh
Close Tab
-zsh
Close Tab
zsh
Close Tab
⌥⌘1
zsh...
|
761
|