DeepSeek Harness Remote
DeepSeek Harness Remote 可将手机或另一台电脑与你运行 DeepSeek Harness 的电脑安全连接,随时随地继续你的工作,方便随时查看进度并继续工作。
AI 翻译
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Rewind your Mac or PC. OpenRewind records your screen and audio, pulls the text out, and lets you search or scroll back through everything you saw and heard. 100% local. Open source. A small Swift app on the Mac, a native .NET app on Windows.
OpenRewind was called openscreen until October 2026. On first launch it moves
~/.openscreen to ~/.openrewind and keeps every recording and your menu settings.
macOS treats it as a new app, so it asks for Screen Recording, Microphone and
Accessibility again; you can then delete the old OpenScreen.app (and its Login Item).
On November 1, 2022, Rewind launched with $10M from Andreessen Horowitz, at a $75M valuation. The founders were Dan Siroker (co-founder of Optimizely) and Brett Bejcek.
The idea was simple and a little wild. Your Mac records everything on your screen and everything said in your meetings. Then you can search any word and jump back to that moment. It all ran on your own Mac, made possible by Apple Silicon. Rewind promised it would "never sell your data or do advertising."
In April 2023, Rewind raised its Series A in public. Siroker posted the pitch deck and asked investors to send offers. More than a thousand investors showed interest and 170 made offers. NEA led the round at a $350M valuation.
In April 2024, Rewind renamed itself Limitless and moved to a $99 AI pendant that records your conversations. The Mac app stopped getting updates.
On December 5, 2025, Meta bought Limitless. The team moved to Meta's wearables group. The Rewind Mac app was shut off: on December 19, 2025, all screen and audio capture stopped. Users in the EU, UK, and some other countries had two weeks to export their data before it was deleted.
A tool that remembers your whole digital life should not be able to vanish when a company is sold. So we built it again, in the open:
~/.openrewind. No account. No cloud.OpenRewind is new code. It does not contain any Rewind code. The idea and the full-screen timeline (⌥⌘T) are modeled on Rewind's.
OpenRewind is not made by or connected to Rewind AI, Limitless, or Meta.
http://127.0.0.1:3031 (off in the app until you turn it on).OPENREWIND_EXCLUDE adds more app names from the terminal.whisper-cli from
whisper.cpp) or NVIDIA Parakeet v3, your pick in Settings → Transcription Model
(see Choosing a transcription model). Transcripts go into
their own FTS5 index and show up in the same search as screen text.Settings → Compress Older Recordings keeps screenshots older than an hour as short videos instead of one picture each. Screens change little from one frame to the next, so a video takes about 5 to 10 times less disk space. It is off by default: it is new and has not been tested on many Macs and PCs yet. The storage line in the menu shows what the videos save ("Using 3.1 GB · video saves 14.2 GB").
GET /frames/{id} still returns a JPEG), and
Ask AI's screenshots all read frames through one loader. It seeks exactly to each frame, keeps
the last few videos open (closed after 30 s unused on Windows) and the last 48 frames decoded
(at most 256 MB), so scrubbing stays quick. A keyframe every 20 frames means one frame never
needs more than 20 decoded to show it.doctor say how many videos still
hold deleted frames.openrewind video-check (Mac) or OpenRewind.exe video-check (Windows) checks that this
computer can make the videos: it compresses made-up screenshots in a temporary folder, reads
every frame back, deletes some and checks the rewrite, compresses a capture wider than 4096
pixels, and (on the Mac) turns a video back into pictures. shows which codec would be
used, how much space the videos save, and whether the videos already made still open (after
moving the data folder to another computer, say).Keyword search finds the words you type. Search by Meaning also finds moments that are about the same thing in other words: "the flight I was booking" finds the airline page, "when we talked about hiring" finds the call where someone said "we need another engineer".
Turn it on in Settings → Search by Meaning. OpenRewind then builds an index in the
background: it goes through your old recordings first and then keeps up with new ones. It works
slowly while you use the computer, slower still on battery (or in Low Power Mode on a Mac), and
faster when you are away. The line under the switch shows how far it has got. If the index
can't be saved (for example, the disk is full), the line says Paused. OpenRewind tries again
after 1 minute, then waits twice as long each time, up to 1 hour. After 5 failed tries in a row
it skips that one moment. The reason is in openrewind.log.
Once it is on, the timeline's search box has a Keyword | Meaning switch. Meaning shows the
closest moments first; click one to go there, as with keyword search. The browser search page and
Ask AI (search_by_meaning) can use it too, and so can AI apps connected through MCP.
How it works:
meaning_moments), and its vector (table meaning_vectors): up to about 2 KB per moment.
So the index holds screen text too, not only numbers, and is deleted with it.Open it from the menu bar or tray (Ask AI…) or with the Ask AI button in the timeline, which opens the same chat beside the timeline.
Set it up in Settings → AI Settings…: pick a provider, paste your key and pick a model. Type any model name, or Refresh List to ask the provider which models it has, so new models work without an app update. Keys are kept in the Mac Keychain or the Windows Credential Manager, never in the settings file or the database.
Requests go straight from your computer to the provider; there is no OpenRewind server. The model never gets your whole history. It calls lookups that run on your database and send back capped, trimmed text:
| Lookup | What it sends |
|---|---|
activity_summary | Time per app, window and website, and a timeline of what was in front |
search_screen | Matching moments from the screen-text search, with a short snippet |
search_audio | Matching transcript lines (or all of them in a time range) |
search_by_meaning | The moments closest in meaning to a question, with a short snippet. Only offered while Search by Meaning is on |
get_screen_text | Screen text from a short time range, sampled and trimmed |
view_screenshot | One screenshot near a moment, as a JPEG. Only offered when you turn on Let AI look at screenshots (off by default) |
list_meetings | Meetings in a time range, with their summary, decisions and action items when they have notes (see Meetings) |
list_starred | Moments the user starred (⌥⌘S / Ctrl+Alt+S), with what was on screen; blocked apps and sites are left out |
list_promises | Things the user promised (what, for whom, due), open ones first. Only offered while You promised is on; blocked sources are left out |
Each lookup shows in the chat with the arguments the AI asked for and exactly what was sent back. Times in answers link back to that moment in the timeline. Each answer shows the tokens it used and what they cost; the header shows the chat's total and AI Settings keeps a running total per provider. Prices are built in for Claude and GPT-6 models and come with OpenRouter's model list; for other models you can type the price. Lookups leave out every app, site and window on your block list, including anything saved before you blocked it (the activity summary still counts a blocked app's time, as "(blocked app)", without its name); audio transcripts are not filtered by app. Web links in an answer only open if you or a lookup supplied that address, so text on screen can't trick the AI into a link that sends your data elsewhere. With a local model (Ollama, LM Studio) nothing leaves your computer at all; a custom server reached over plain http on another network gets a warning, since your key would travel unencrypted.
Open it from the menu bar or tray (Journal…). Each page is one day: ‹ and › go to the day before or after, the date picker jumps to any day, and Today comes back.
Every page has a part worked out on your computer, with no AI and nothing sent anywhere:
Apps, sites and windows on your block list are never shown: a blocked app is left out of every list, and a blocked site or window keeps only its app name. Screenshots saved while a blocked window or site was in front are left out of every list too (their time still counts as active). Click a time to open that moment in the timeline.
Recap: with an AI provider set up in AI Settings, Write Recap asks your model for a short recap: what you worked on, who you talked to, and open loops to follow up. It sends that day's history with your key: app and window names, web addresses, transcripts and some screen text.
journal_recaps), so a day is not written (or paid for) again;
Rewrite replaces it. One written before the day was over says so.Settings → Write Each Day's Recap Automatically (also a switch in the Journal window) is off by default because it spends tokens. When on, it writes yesterday's recap the first time the app is running on the next day, with the AI provider it was turned on for; after you switch providers in AI Settings it pauses until you turn it on again.
Deleting recordings: deleting a time range by hand (Delete Recordings → Last Hour, Today …) also deletes the recaps of the days it touches, and deleting all recordings deletes every recap. Keep … Recordings For deletes a day's recap only once nothing of that day (screen or audio) is left, so with Keep For 1 Day yesterday's recap stays while part of yesterday does.
Copy as Markdown and Save as Markdown… export the page. In the recap, times become plain text, any other link or image becomes its text and address in plain text, and HTML is escaped, so opening the file never loads anything.
Get things out of the timeline, on the Mac and on Windows:
Delete things from the timeline, on the Mac and on Windows (each asks first, and can't be undone):
secure_delete), the search index drops the words at once (FTS5 secure-delete; Windows' SQLCipher
is too old for it, so there the index is merged after a delete, a little at a time), and the
write-ahead log is emptied. The same goes for Delete Recordings in the menu.What is left out:
A screenshot lasts until the next one, at most a minute, so long breaks are skipped. A clip covers at most 2 hours; videos are at most 1920 pixels wide and GIFs 1280, with at most 600 pictures (fast parts drop pictures to stay under that). MP4 uses H.264 (AVAssetWriter on the Mac, the encoder built into Windows). GIFs use a small encoder in OpenRewind on both, which writes as it goes, only stores the part of each picture that changed, and stops at once on Cancel.
OpenRewind finds your calls in what it already records; nothing extra runs during a call. A meeting starts as soon as a call is on your screen: a Google Meet meeting (not Meet's start page), Zoom's meeting window or a Zoom meeting in the browser (not Zoom's home), a Teams call or meeting window, a Webex meeting, a FaceTime call or a Slack huddle. Another window of these apps (say, Zoom or Teams with no meeting name in its title) counts only once other people can be heard (system audio) for a minute. A meeting goes on while its window or page is in front; after you switch away, your microphone keeps it going for up to 30 minutes (say, while you share slides) and other sound for up to 15. It ends after 3 minutes with none of these, and calls in the same app less than 10 minutes apart (a dropped call, a rejoin) become one. Blocked apps, sites and private windows never become meetings. Without Whisper, audio waiting to be transcribed does not count as sound.
Take notes? Within about 10 seconds of a call coming to the front, even before anyone speaks, a small popup asks "Meeting detected in Google Meet. Take notes?" in the corner of the screen. It does not take focus from the call, and it stays while you switch to other windows (until a while after the call ends). It asks only once per call. If you say Take Notes, the call is kept with its transcript from the moment you joined, even if you spend the call in other windows.
Meetings… in the menu bar or tray lists them by day. Each one shows its transcript, built from the audio transcripts of that time: lines from your microphone are Me, lines from system audio are Others (OpenRewind does not tell people apart). Open in Timeline jumps to the start, Copy as Markdown and Save as Markdown… export the notes and transcript.
Summaries are off by default. They use your Ask AI provider and key, cost tokens, and send the call's whole transcript to that provider. The transcript is not filtered by app: anything said or played during the call is sent, even while a blocked app or site was in front. Turn on Settings → Summarize Meetings with AI to have each call you take notes for summarized when it ends (only calls that end after you turn it on), or press Summarize on one meeting. Summaries go only to the provider you agreed to; if you switch providers in AI Settings, OpenRewind asks again and pauses summaries until you answer. If Whisper is still catching up when a call ends, OpenRewind waits up to 2 hours, and makes the notes once more if more of the call is transcribed afterwards.
You get a short summary, decisions and action items, with the tokens and cost it used, as in Ask AI. Notes never contain web links (only links into your timeline), since the AI writes them from what other people said. Ask AI can read them too: "what did we decide in my 2pm call?" Deleting audio recordings deletes the meetings in that time, and they are not found again from what is left; deleting screen recordings clears the window titles they kept.
Open it from the menu bar or tray (Insights…). Switch between Day and Week, and use ‹ › (or ← →) for the day or week before or after. It shows:
Click an app to open the timeline showing only that app, at the first moment you used it that day or week. Click a website or a focus session to jump to it.
Everything is worked out on your computer from what was saved with each screenshot (time, app, window title, address); nothing is sent anywhere and no AI is used. The window follows Settings → Timeline Look.
Blocked apps and sites. Screenshots saved while a blocked app, window or site was in front are marked as blocked and left out entirely, as is anything that matches your block list now (by app name, window title or address). One gap: screenshots saved by an older version while a blocked site or window was in front kept only the browser's name, and ones from a helper app of a blocked app (Docker.app shows "Docker Desktop") kept the helper's name, so that older time can still show under the browser or the helper app. Block the helper's name too to hide it.
How time is counted. Time counts from one screenshot to the next. A break of more than 2
minutes (locked, asleep or paused) does not count. A screen whose text doesn't change only gets one
screenshot a minute; after 5 minutes of that, the rest counts as away until something changes,
unless speech was recorded at the time (a call or a video, with Record Audio on), which counts
as being there. With audio recording off, a long call or video can count as away after 5
minutes. If you record from the terminal with --interval of 50 seconds or more, every screenshot
looks like a still screen and active time is undercounted; keep the interval under 50 seconds.
Ask AI's activity summary counts every gap up to 2 minutes without the still-screen rule, so its
totals can be a little higher than Insights'.
The first launch after updating builds a database index for Insights in the background (seconds, or about a minute for a very large history on a slow disk). Until it is done, Insights still works, just more slowly.
Claude Desktop, Claude Code, ChatGPT, Cursor and other apps that support the Model Context Protocol can look things up in your history with the same lookups as Ask AI (the table above). Ask them "what was I reading about databases yesterday?" and they search OpenRewind on your computer.
It is off by default. Open Settings → Connect AI Apps… and click the button for your app:
| Button | What it changes |
|---|---|
| Add to Claude (Claude Desktop) | the openrewind entry in claude_desktop_config.json (Mac: ~/Library/Application Support/Claude/; Windows: %APPDATA%\Claude\, or %LOCALAPPDATA%\Packages\Claude_…\LocalCache\Roaming\Claude\ for the Microsoft Store version) |
| Add to Claude Code | runs claude mcp add --scope user openrewind -- <this app> mcp when it finds the claude command; otherwise writes the same entry in ~/.claude.json |
| Add to ChatGPT | the [mcp_servers.openrewind] table in ~/.codex/config.toml (Windows: %USERPROFILE%\.codex\config.toml; CODEX_HOME if you set it), which the ChatGPT desktop app and Codex read |
| Add to Cursor | the openrewind entry in ~/.cursor/mcp.json |
Adding an app also turns on Allow AI Apps to Read My History (MCP). Each row then says
Added, offers Restart Claude (or ChatGPT, Cursor) when the app is open, since apps read
their setup when they start, and Remove, which takes out exactly that entry. Restart asks
first, then quits the app the normal way and opens it again; a reply it is still writing, or a
message you haven't sent, may be lost. If the entry points at another copy of OpenRewind (you
moved the app) or has options you added, the row says so and the button reads Update. If you
turned OpenRewind off in the app ("disabled": true, or enabled = false for ChatGPT), the row
says Turned off and Turn On switches it back on.
<file>.openrewind-backup next to it, readable only by
you, and Remove deletes it. If the file is a link into a folder you keep in git (dotfiles),
the backup is created in that folder: add *.openrewind-backup to its .gitignore.claude command when OpenRewind finds it (also when
installed with nvm, Volta, asdf, fnm, Bun or Homebrew).openrewind some other way) is never changed: the row says what's wrong and
you can set it up by hand.config.toml. What OpenRewind returns there goes
to OpenAI like anything else in the chat. Regular chats and chatgpt.com in a browser can't reach
it: they only connect to MCP servers on the internet.For other AI apps, the window also shows the lines to paste, with this copy's path filled in and
a Copy button. For most apps they look like this (Mac path shown; on Windows it is the path of
your OpenRewind.exe):
{
"mcpServers": {
"openrewind": {
"command": "/Applications/OpenRewind.app/Contents/MacOS/OpenRewind",
"args": ["mcp"]
}
}
}
Claude Code by hand, run once:
claude mcp add --scope user openrewind /Applications/OpenRewind.app/Contents/MacOS/OpenRewind mcp
ChatGPT and Codex by hand, in ~/.codex/config.toml:
[mcp_servers.openrewind]
command = '/Applications/OpenRewind.app/Contents/MacOS/OpenRewind'
args = ['mcp']
How it works:
OpenRewind mcp (Windows: OpenRewind.exe mcp, or --mcp) and talks to it
over stdin/stdout. It shows no icon or window, records nothing and never changes the database:
it opens it read-only, so it works whether or not OpenRewind is running.search_audio. One activity summary
covers at most 31 days. Screenshots are only shared when Let AI look at screenshots is on in
AI Settings.OPENREWIND_EXCLUDE are not applied here: the AI app starts OpenRewind with
its own environment. They are still never recorded; only frames saved before you added a name
can show up. Put apps on Blocked Apps & Sites to hide them everywhere.2026-10-18T14:30:05-07:00), which the AI
can pass back to read more around it.Settings → Transcription Model picks what turns recorded speech into text. Every choice runs on your computer; audio never leaves it.
| Model | Download | Languages | Notes |
|---|---|---|---|
| Whisper (Automatic) (default) | none | 99 | Uses the ggml Whisper model already on the computer (see Whisper). Needs whisper-cli. |
| Whisper Base | 148 MB | 99 | Fast, less accurate. Needs whisper-cli. |
| Whisper Small | 488 MB | 99 | A good balance. Needs whisper-cli. |
| Whisper Large v3 Turbo | 574 MB | 99 | The most accurate Whisper, and the slowest. Needs whisper-cli. |
| NVIDIA Parakeet v3 | 670 MB | 25 European | Very accurate, with punctuation and capitals, and fast on a CPU. Needs nothing else. |
~/.openrewind/models: Whisper files where Whisper already looks, under their own names
(ggml-small.openrewind.bin, so a ggml-small.bin you put there yourself is never replaced);
Parakeet in models/parakeet-tdt-0.6b-v3-int8. Delete a file to free the space.audio_transcriptions.engine:
whisper.cpp:ggml-small, parakeet-tdt-0.6b-v3, …). Search, Ask AI, the timeline and MCP read
every line the same way.--language option only applies to Whisper. For other languages pick a Whisper model: when
--language is set to one Parakeet does not know, picking Parakeet (or re-transcribing with it)
warns first.THIRD_PARTY_NOTICES.txt, which ships with both apps). It holds about 1 GB of memory while it is
loaded and lets go of it after 5 minutes with no audio to do. While audio recording is on, a clip
arrives every 30 seconds, so it stays loaded the whole time; turn audio off, or pick Whisper, to
get that memory back. Long audio (ingest-audio of a talk, or a long --chunk) goes through the
model in pieces of at most 30 seconds, so memory stays the same however long it is. On a 4-core
Linux test machine (the Windows code) a 30 s clip took 3.4–3.6 s, about 9 times faster than real
time, and 5 minutes took 25 s.NVIDIA Parakeet TDT 0.6B v3 is made by NVIDIA and licensed CC-BY-4.0. OpenRewind downloads the version converted to ONNX and quantized to int8 by the sherpa-onnx project (Apache-2.0), and uses it as it is. Whisper models are OpenAI's Whisper (MIT) in the ggml format of whisper.cpp (MIT).
scripts/build-app.sh
This makes dist/OpenRewind.app and dist/openrewind-<version>.dmg.
Copy the app to /Applications and open it, or run scripts/install.sh, which builds,
copies to /Applications and restarts the app in one step. It lives in the menu bar:
list_starred.Downloads open without a warning only when the app is signed with a Developer ID Application certificate and notarized by Apple:
xcrun notarytool store-credentials openrewind --apple-id [email protected] --team-id TEAMID
NOTARY_PROFILE=openrewind scripts/build-app.sh
Upload the .dmg (GitHub Releases, your site, etc.).
Without these steps the app still works, but other people must right-click → Open.
Both apps ask GitHub for the latest release every 6 hours and when you open the timeline. A newer
version shows a banner at the top of the timeline (✕ hides it until the next version) and a row in
the menu. Settings → Download Updates Automatically (on by default) fetches it in the background;
nothing is installed until you click Update / Restart to Update, which swaps the app in place
and reopens it. Settings → Check for Updates… checks right away.
Releases come from the Release workflow (git tag v0.3.0 && git push origin v0.3.0); the check needs
the repository to be public. Screen Recording, Accessibility and Microphone stay on across updates
because every build is signed with the same certificate (below).
macOS remembers Screen Recording, Accessibility and Microphone for the certificate an app is signed with. An ad-hoc signature is new on every build, so each update used to lose them. Now every build is signed with one long-lived certificate:
Make it once: scripts/make-signing-cert.sh writes a self-signed "OpenRewind Code Signing"
certificate to signing/ (valid 20 years). Keep the .p12 and password safe and don't commit
them: anything signed with that key gets the permissions you gave OpenRewind.
GitHub Actions: the real certificate is only for releases. It lives in a release
environment that only main and v* tags can use, so a pushed branch or a PR can't reach it
even by editing a workflow. Branch and PR builds sign with a throwaway certificate. Set it up once:
release.main and the
tag pattern v*. Optionally tick Required reviewers and add yourself, so each release waits
for your click.MACOS_CERTIFICATE_P12 (the contents of
openrewind-signing.p12.b64) and MACOS_CERTIFICATE_PASSWORD (the contents of password.txt).AZURE_* ones, after adding them to the environment). Repository secrets are open to
every branch.v*, restricting creation to you, so
nobody else can push a tag that opens the environment.CI imports the key as non-extractable and deletes the keychain after signing. The Release workflow refuses to build the Mac app without the secrets.
Your Mac: double-click openrewind-signing.p12 and enter the password. scripts/build-app.sh
picks it up (after a Developer ID certificate, before Apple Development or ad-hoc); allow
codesign to use the key when asked.
Developer ID later: export the Developer ID Application certificate as a .p12 and put it in
the same two secrets. That also removes the "unidentified developer" warning (with notarizing).
Changing the certificate (ad-hoc → self-signed, or self-signed → Developer ID) means turning the permissions on one more time; after that, updates keep them.
Windows 10 (2004+) and 11, x64 and ARM64. Same timeline, search page, API and data format as the Mac app; the timeline opens with Ctrl+Alt+T. Download, setup and build steps are in windows/README.md:
scripts\build-windows.ps1
swift build -c release
.build/release/openrewind doctor
.build/release/openrewind
Then open http://127.0.0.1:3031.
Needs whisper-cli (brew install whisper-cpp) and a ggml model. Settings → Transcription
Model downloads one (Whisper Base, Small or Large v3 Turbo), or OpenRewind looks for a model in
this order:
--whisper-model PATH or $OPENREWIND_WHISPER_MODEL~/.openrewind/models/ggml-*.binggml-large-v3-turbo-q5_0.bin)NVIDIA Parakeet v3 needs neither whisper-cli nor a ggml file: pick it in Settings and it downloads.
Test it without a mic:
.build/release/openrewind ingest-audio /opt/homebrew/share/whisper-cpp/jfk.wav
macOS asks for Screen Recording (screen + system audio) and Microphone permission for the app that runs the command (for example Terminal). Grant it, then run again. Accessibility permission is optional; it gives cleaner text than OCR.
On when you run record or serve from the terminal, or after Settings → Local Search Server in the app.
Nothing the block list covers comes back: screenshots of a blocked app, a blocked site, a private
window or a window or address with a blocked word are left out of /search (also mode=meaning),
and /frames/{id} answers 404 for them, the same rule as Ask AI and AI apps. That includes
screenshots saved before you blocked them, when the blocked app, site or window was the one in front.
An older screenshot of another app can still show a blocked window behind it, and its text can
include text from that window. /apps leaves out blocked apps. Audio transcripts are not filtered
by app (a clip has no app). The total in pagination counts only what can be shown, on every page.
If a search would have to skip more than 20,000 hidden screenshots, it stops there: pagination
then has "truncated": true, and total counts only what comes before that point.
| Route | What |
|---|---|
GET /health | Status, frame count, permissions |
GET /search?q=&app_name=&window_name=&start_time=&end_time=&limit=&offset=&max_content_length= | Full-text search. Times: ISO, 2h ago, today, yesterday, YYYY-MM-DD |
GET /frames/{id} | Snapshot as JPEG (also for frames kept in a video) |
GET /apps?start_time= | Apps with frame counts |
GET /audio/{chunk_id} | Audio chunk WAV |
content_type: all (screen + audio), ocr (screen only), audio.
mode=meaning searches by meaning instead of words (only while Search by Meaning is on, else
400; /health says "search_by_meaning": true). Results come best first, in the same shape plus a
score, and leave out blocked apps and sites. A screen result is a moment: timestamp is where
it starts and text is the moment's text.
Response: {"data":[{"type":"OCR","content":{"frame_id","text","timestamp","app_name","window_name","file_path","text_source"}},{"type":"Audio","content":{"chunk_id","transcription","timestamp","start_time","end_time","device_name","device_type"}}],"pagination":{"limit","offset","total"}} (plus "truncated": true when a search stopped early, see above)
Both are off by default. Find them in Settings → Encryption & Lock, on the Mac and on Windows.
Encrypt Recordings encrypts new screenshots, audio clips and compressed videos (Compress Older Recordings) with AES-256-GCM, and the database with SQLCipher. The database holds everything else OpenRewind keeps: the text of each screenshot, transcripts, the Journal's recaps, Meetings and their notes, and the Search by Meaning index, so those are encrypted too. What is already recorded is encrypted in the background; quitting halfway is fine, it carries on at the next launch. Turning it off decrypts everything back the same way. The menu shows how far it has got. The database is rewritten in one go first: recording waits until that is done (a few seconds, up to a minute or two for a very large history), and it needs free disk space for a second copy of the database.
~/.openrewind
folder, and other user accounts on the same computer. Without your login they see only
encrypted files.~/.openrewind/encryption-key.dpapi). Anything that can run as you can ask for it too. The
login Keychain is a file (~/Library/Keychains/login.keychain-db) protected by your login
password; it is not tied to this Mac, so a copy of it plus your password opens the key.~/.openrewind/openrewind.log) is a plain file. With encryption on it no longer
names the app of each saved frame or meeting, or a meeting's times; earlier lines (from before it
was on) still do.data/video encrypted; no plain video is written under data/. Copies left by a crash
are removed when the app, record, serve or mcp next starts, and on each pass of Compress
Older Recordings.Require Touch ID or Password to Open Timeline (Mac) / Require Windows Hello to Open Timeline
(Windows) asks before showing the timeline, search, Ask AI, Journal, Meetings, Insights, Blocked Apps &
Sites, the data folder and setup, before opening a moment from an Ask AI answer, and before deleting recordings or
changing how long they are kept. Recording keeps going while locked. An unlock lasts until the screen
locks or the computer sleeps, or until Lock Again After has passed with none of those windows in
use (5 minutes, 15 minutes (default), 1 hour, or only when the screen locks); then they close. While
locked, the Local Search Server answers 423 Locked for search, screenshots and audio, and /health
says only that it is running. AI apps (MCP) follow the lock too: with it on, they get your history
only while OpenRewind is running and unlocked (within Lock Again After of its last use), and
otherwise get a message saying it is locked. Turning AI apps on or off and Connect AI Apps… ask
for the unlock first. Windows Hello needs at least a PIN; without it (or after it is removed)
your Windows password works instead, so you can always turn the lock off. A Mac needs a login password.
The lock is against someone using your computer while you are away from it, not against programs
running as you: those could turn it off in the settings file (settings.json on Windows,
defaults on the Mac) or run OpenRewind serve from a terminal. Encrypt Recordings is what protects
the files.
~/.openrewind/db.sqlite, ~/.openrewind/data/<date>/*.heic (*.jpg on Windows and older recordings),
~/.openrewind/data/video/<date>/*.mp4 (with Compress Older Recordings on), and
~/.openrewind/data/audio/<date>/*.wav. In the API, a frame kept in a video has the video as
file_path and its frame number in it as offset_index.
With Encrypt Recordings on, these files keep their names but are encrypted (see
Encryption and App Lock).
Delete the folder to wipe everything, or from the terminal:
.build/release/openrewind delete older:week
(15m, 1h, today, all, older:day|week|month|year; add --screen-only or --audio-only.)
MIT. Use it, change it, share it. What the apps include from others, and under which licenses, is in THIRD_PARTY_NOTICES.txt.
sk-…, ghp_…, xox…-, AWS and Google keys, JWTs, private key
blocks, long random strings) and card numbers (Luhn-checked) are blurred, and their text,
window title, address and audio transcripts get [redacted] instead. Search, AI and the local
server never see them. Older recordings are not changed.list_promises). Blocked apps and sites are never sent.doctor--model parakeet-v3 (or whisper-small, …) picks a model for one run, for
example openrewind ingest-audio talk.wav --model parakeet-v3.http://127.0.0.1:3031. Off by default. Only this Mac can connect. The terminal
commands record and serve always start it. Blocked apps and sites are left out of it, as
in Ask AI.~/.openrewind/openrewind.log.OpenRewind mcp reads the key the same way the app
does (Keychain or DPAPI) and opens the database read-only. With the App Lock on, they follow it (see
below).ORENC, the version, a key id (4 bytes), a 12-byte
nonce, the encrypted data and a 16-byte tag. The file key and the database key are both derived
from the one key you can export (HKDF-SHA256, salt OpenRewind, info openrewind/files/v2 and
openrewind/db/v2), so they are never the same. Each file is also bound to its place under
data/ (for example 2026-10-19/14-30-05.jpg), so files swapped or moved inside the folder do
not open. Plain and encrypted files can sit side by side, so the switch can stop anywhere.Package.resolved), and SQLitePCLRaw.bundle_e_sqlcipher 2.1.10 on Windows, which carries an
older community build (SQLCipher 4.5.2). Both use the SQLCipher 4 default format, so a database
moves between them; the Windows one should move to a newer build when one is available. Their
licenses are in THIRD_PARTY_NOTICES.txt, which ships with both apps.RecordingFile.read(path)
on the Mac and RecordingFile.Read(path) on Windows. It returns the plain bytes of a plain or an
encrypted file. Pictures (stills and video frames) go through FrameImages, and both speech
engines read clips through Transcriber.loadClipSamples (Mac) / Transcriber.LoadClipSamples
(Windows), which use it. New features that open screenshots, videos or audio should call these
too; recordings are written with RecordingFile.write / RecordingFile.Write.
OpenRewind selftest-encryption (Mac) checks the format against the vectors in the Windows tests.