I started out using [ActivityWatch](https://activitywatch.net/), which is great at what it does — but it tracks how much time you spend in each app, not what you actually saw. It could tell me I spent 40 minutes in Firefox; it couldn't help me find the doc I had open, the error message I skimmed past, or the paragraph I read three days ago. I wanted actual recall — searchable content, not time buckets — and nothing on Linux did that. (Closest references are Windows Recall and the late Rewind.ai, but both were closed-source and never came to Linux.)
How it works: - A background daemon grabs frames via `xdg-desktop-portal` + PipeWire (so it works on any Wayland compositor that implements the ScreenCast portal — tested on KDE and GNOME). - Perceptual hashing (gradient hash, hamming distance) drops near-identical frames before they hit disk. - Tesseract does OCR; text goes into SQLite + FTS5. Full-text search comes back in under 100ms across weeks of history. - Optional semantic search: Ollama embeddings (nomic-embed-text) → sqlite-vec, fused with keyword results via Reciprocal Rank Fusion. Off by default; the whole thing works fully offline without it. - WebP screenshots only, no video. Storage stays manageable.
Beyond search there's a timelapse "rewind" view, a dashboard (app-usage stats, activity heatmap — the ActivityWatch part, basically, but tied to actual content), an Ask view that answers questions about your history with click-through citations to the actual screenshots, a Tiptap journal, and Obsidian/Logseq vault export. The daemon also ships an MCP server, so you can query your own screen history from Claude Code or any MCP client — "what was that doc I had open yesterday?" — without leaving the terminal.
Privacy specifics, since this is the whole point: - Exclude apps or window-title patterns (password managers, private browsing) so they're never captured. - The only network call it makes on its own is a daily heartbeat through a Cloudflare Worker (also open source, in the repo) that hashes your IP with a daily server-only salt to count distinct devices, then discards it — no IP, no identifier, no payload stored, just an anonymous daily count bucketed by version + desktop env. Stats are published live. Opt out with `usage_heartbeat = false`.
Stack: Rust (Cargo workspace — core lib + capture daemon), Tauri, React 19. Daemon is a systemd user service.
Limitations, honestly: Wayland only (no X11), x86_64 prebuilt binaries only, and wlroots compositors (Hyprland/Sway) should work via the portal but I haven't fully verified them. GNOME needs the "Window Calls Extended" extension to get app/window names.
Install (Arch AUR coming; for now download-read-run): ``` curl -fsSL https://raw.githubusercontent.com/jaypopat/rewindos/master/s... | bash ```
Would love any feedback — and if you wouldn't daily-drive it, I want to hear exactly what's stopping you.