A passive recording project allows you to have complete control over your data. Automatically take screenshots of all your screens, index them, and save them lo
A passive recording project allows you to have complete control over your data. Automatically take screenshots of all your screens, index them, and save them lo
I changed the name to Pensieve because Memos was already taken.
Pensieve is a privacy-focused passive recording project. It can automatically record screen content, build intelligent indices, and provide a convenient web interface to retrieve historical records.
This project draws heavily from two other projects: one called Rewind and another called Windows Recall. However, unlike both of them, Pensieve allows you to have complete control over your data, avoiding the transfer of data to untrusted data centers.
v0.33.0 ships an agent skill so any Skill-aware AI tool — Claude Code, Codex, opencode, etc. — can search your screenshot archive in natural language and link straight to the entity detail page. See Searching with an Agent Skill.v0.30.0 introduces an application blacklist feature that allows you to exclude specific applications from screenshot recording. This feature includes blacklist checking in both recording and file watching processes, with an enhanced UI for blacklist management in the configuration panel.v0.29.0 introduces a new entity detail page with interactive context navigation, allowing you to browse through screenshots chronologically with improved visual context and metadata display.v0.27.0 introduces an intuitive configuration management interface that allows you to easily configure all Pensieve settings through the web interface.[!IMPORTANT]
It seems that not all versions of Python's sqlite3 library supportenable_load_extension. However, I'm not sure which environments or Python versions might encounter this issue. I usecondato manage Python, and Python installed viacondaworks fine on macOS, Windows x86, and Ubuntu 22.04.Please ensure the following command works in your Python environment:
import sqlite3 # Check sqlite version print(f"SQLite version: {sqlite3.sqlite_version}") # Test if enable_load_extension is supported try: conn = sqlite3.connect(':memory:') conn.enable_load_extension(True) print("enable_load_extension is supported") except AttributeError: print("enable_load_extension is not supported") finally: conn.close()If you find that this does not work properly, you can install miniconda to manage your Python environment. Alternatively, check the current issue list to see if others have encountered the same problem.
pip install memosOn Windows, prefer
uv tool install memosorpipx install memosover barepip install— see Windows Installation Notes for the full setup checklist.
Initialize the pensieve configuration file and sqlite database:
memos initData will be stored in the ~/.memos directory.
memos enable
memos startThis command will:
Open your browser and visit http://localhost:8839
On Mac, Pensieve needs screen recording permission. The first time memos start runs, macOS will prompt you to allow screen recording — please allow it.
To check what is currently authorized (without triggering a prompt), run:
memos doctorIt will print the Python interpreter path that needs the permission, and tell you exactly where to find it in System Settings → Privacy & Security → Screen & System Audio Recording.
If you upgrade Python (e.g. brew upgrade python, a new pyenv version, recreating a conda env), the previously granted permission becomes stale because TCC is keyed on the binary path. Reset and re-authorize:
tccutil reset ScreenCapture
memos stop && memos startTo avoid this churn, install via pipx install memos or uv tool install memos — both pin the interpreter path so authorization survives memos upgrades.
For a smoother Windows setup, install memos as an isolated tool rather than into the global site-packages:
# Option A: uv (fast, single binary)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
uv tool install memos
# Option B: pipx
pip install --user pipx
python -m pipx ensurepath
pipx install memosBoth keep memos in a dedicated venv so the Python interpreter path stays stable across upgrades. After install, run memos doctor to verify the environment.
Before memos enable && memos start, two preparations make a real difference:
# Run in an Admin PowerShell
# Enable long paths — some ML wheels (torch, modelscope) have deep paths
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1
# Exclude ~/.memos from Defender so screenshot writes aren't scanned
Add-MpPreference -ExclusionPath "$env:USERPROFILE\.memos"If your %USERPROFILE% is redirected to OneDrive, ~/.memos may sync ~400MB of screenshots per day to the cloud. Change base_dir in ~/.memos/config.yaml to a local, non-synced path.
Avoid these setups on Windows:
~/.memos paths and subprocess behavior%USERPROFILE% synced by OneDrive (see above)To use PostgreSQL with Pensieve, you need to install the package with PostgreSQL support:
pip install memos[postgresql]Starting from version v0.25.4, Pensieve fully supports using PostgreSQL as the backend database. Compared to SQLite, PostgreSQL can maintain excellent retrieval performance even with large data volumes.
If your screenshot data is large or you require high retrieval response speed, it is strongly recommended to use PostgreSQL as the backend database.
Since Pensieve uses vector search functionality, it requires PostgreSQL with the pgvector extension. We recommend using the official pgvector image:
On Linux/macOS:
docker run -d \
--name pensieve-pgvector \
--restart always \
-p 5432:5432 \
-e POSTGRES_PASSWORD=mysecretpassword \
-v pensieve-pgdata:/var/lib/postgresql/data \
pgvector/pgvector:pg17On Windows PowerShell:
docker run -d `
--name pensieve-pgvector `
--restart always `
-p 5432:5432 `
-e POSTGRES_PASSWORD=mysecretpassword `
-v pensieve-pgdata:/var/lib/postgresql/data `
pgvector/pgvector:pg17On Windows Command Prompt:
docker run -d ^
--name pensieve-pgvector ^
--restart always ^
-p 5432:5432 ^
-e POSTGRES_PASSWORD=mysecretpassword ^
-v pensieve-pgdata:/var/lib/postgresql/data ^
pgvector/pgvector:pg17This command will:
pensieve-pgvectormysecretpasswordpensieve-pgdata for persistent data storageNote: If you are using Windows, make sure Docker Desktop is installed and running. You can download and install Docker Desktop from the Docker website.
Modify the database configuration in the ~/.memos/config.yaml file:
# Change the original SQLite configuration:
database_path: database.db
# To PostgreSQL configuration:
database_path: postgresql://postgres:mysecretpassword@localhost:5432/postgresConfiguration explanation:
postgres:mysecretpassword: Database username and passwordlocalhost:5432: PostgreSQL server address and portpostgres: Database nameIf you previously used SQLite and want to migrate to PostgreSQL, Pensieve provides a dedicated migration command:
# Stop the Pensieve service
memos stop
# Execute the migration
memos migrate \
--sqlite-url "sqlite:///absolute/path/to/your/database.db" \
--pg-url "postgresql://postgres:mysecretpassword@localhost:5432/postgres"
# Modify the configuration file to point to PostgreSQL
# Edit ~/.memos/config.yaml to update database_path
# Restart the service
memos startNotes:
Below are the migration commands for Mac and Windows:
# Mac
memos migrate \
--sqlite-url "sqlite:///~/.memos/database.db" \
--pg-url "postgresql://postgres:mysecretpassword@localhost:5432/postgres"# Windows PowerShell
memos migrate `
--sqlite-url "sqlite:///$env:USERPROFILE/.memos/database.db" `
--pg-url "postgresql://postgres:mysecretpassword@localhost:5432/postgres"# Windows Command Line
memos migrate ^
--sqlite-url "sqlite:///%USERPROFILE%/.memos/database.db" ^
--pg-url "postgresql://postgres:mysecretpassword@localhost:5432/postgres"Pensieve v0.29.0 introduces a comprehensive entity detail view that provides deeper insights into your screenshots:
The new entity view makes it easier to reconstruct your digital timeline and find related content around specific moments.
Pensieve v0.33.0 ships an agent skill — a portable, agent-agnostic instruction file that teaches any Skill-aware AI tool (Claude Code, Codex, opencode, …) how to query your screenshot archive over the HTTP API.
What you get:
No open issues yet, or sync has not completed.