Skip to main content

InkVault

InkVault logo

Local-first, user-owned persistent memory for your AI conversations, browsing, and work.

Keep the context behind your work: what you asked, what you learned, and the pages you opened. InkVault preserves supported AI sessions and the browser history you choose in a local SQLite vault, so you can find them again after the original tools have cleared their history.

Search your vault yourself in the Memory Atlas, or connect an AI tool through MCP so it can retrieve past context when you ask. Optional Windows screen capture adds a timeline of the apps you use and text from apps you choose. You control the sources, the vault folder, and the backups.

InkVault is free and MIT licensed. No account or telemetry. InkVault itself does not upload your archive. If you connect an AI client, memories returned to that client may be sent to its model provider under that client's settings.

Start your vault

You need uv and a terminal. Copy your supported local sessions and chosen browser history into a vault:

uvx --from git+https://github.com/sandoreclegane/inkvault inkvault sync

In a terminal, InkVault greets you, asks which browser profiles are yours before reading their history, shows progress while it builds search, and ends with a short summary. It downloads the search model on first use (about 130 MB). When everything saved, the Memory Atlas opens by itself. Add --no-open to skip that. For later visits, inkvault dashboard opens the Atlas again:

uvx --from git+https://github.com/sandoreclegane/inkvault inkvault dashboard

Search for something you remember, select a result, and read it in context. Add inkvault schedule to refresh and back up your vault nightly, or connect your AI tools to search it from a conversation.

Have a Pieces archive to save? See Rescuing from Pieces.

What InkVault preserves

With a nightly schedule, InkVault reads the session files Claude Code and Codex already keep on disk, and the history of the browser profiles you chose, and copies in what's new: what you asked, what the assistant answered, what each session was called, and which pages you opened. Your AI tools can then search what they helped you with, and what you were reading, last month or last year, long after the original files are gone.

  • Claude Code: every project, from ~/.claude/projects. Synced messages stay in your vault after source cleanup.
  • Codex: every session it saved, from ~/.codex/sessions.
  • Claude desktop app (agent mode, Windows): including prompts only its audit log kept.
  • Your browsers: Chrome, Edge, Comet, Brave, Arc, Vivaldi, Opera and Firefox, only the profiles you say are yours (how). Kept past the browser's own cleanup.

Only what's new since the last sync is added. Tool output and attachments are left out, and sign-in codes and tokens are cleaned out of web addresses (see Privacy).

What you get

  • A vault you own: preserved sessions, chosen browser history, optional screen activity, and any rescued Pieces records in one local SQLite file, vault.db. Keep it independently of the tools that produced it.
  • Search for your AI tools: an MCP server with search_memories (keyword + meaning, merged), timeline ("what was I doing in March?"), get_memory, and memory_stats.
  • Memory Atlas: open it with inkvault dashboard (or the InkVault Atlas icon from inkvault dashboard --shortcut on Windows). It shows your year: active hours per day (hover a day for what it was about), when you work, how your projects connect, projects and topics over time, top apps and sites. Every chart has a table view. A Search view finds things across your vault and opens the original in a reader. It runs on this computer only (127.0.0.1, a private link, stops when idle) and needs no internet.
  • Daily Light (v0.3.2): a daily quotation from 32 curated public-domain passages, chosen by your local date, without using your history. Hide it for the current Atlas session. When indexed activity exists on today's date in an earlier year, On this day opens it in Search. You can also browse any date range by setting both From and To without entering a keyword. These date-browsing additions are Atlas-only; MCP tools are unchanged.
  • Your Claude Code, Codex and Claude desktop sessions: your prompts and the replies, side by side with your other preserved history, searchable as chats (named like Claude Code · project: title), and part of the timeline, the digests and the dashboard.
  • Your browser history: pages you opened in Chrome, Edge, Comet, Brave, Arc, Vivaldi, Opera or Firefox, from the browser profiles you say are yours. Visits already copied stay in the vault after the browser removes them. Searchable as web, on the timeline, in the digests and on the dashboard.
  • Screen capture (optional, Windows): a timeline of the windows you used, plus the text of the windows in apps you choose. No images are kept. See Screen capture.
  • Daily digests (optional): a 2-3 sentence summary of each day, written by a local model through Ollama. Summarize your preserved activity without sending it to a hosted model.

Connect your AI tools

Claude Code

claude mcp add inkvault --scope user -- uvx --from git+https://github.com/sandoreclegane/inkvault inkvault serve

Codex (~/.codex/config.toml)

[mcp_servers.inkvault]
command = "uvx"
args = ["--from", "git+https://github.com/sandoreclegane/inkvault", "inkvault", "serve"]

Hermes, Claude Desktop, and other MCP clients: run uvx --from git+https://github.com/sandoreclegane/inkvault inkvault serve over stdio.

Then ask: "What was I working on the week of March 10?", "Find that retry helper I saved", "When did I last look at the Stripe dashboard?"

Your browser history

A browser profile can belong to someone else, so InkVault reads none until you choose:

inkvault browsers

It lists every profile it finds (browser, name, signed-in email) and asks which are yours. sync and rescue ask too when they find a new one; the nightly run never asks, and skips profiles you haven't chosen. If someone else starts using a browser on this computer, run inkvault browsers again: InkVault notices a profile that was replaced on Windows and macOS, and when a profile's signed-in account changes, but it can't always tell.

  • inkvault browsers --no "chrome/Profile 2" --forget stops copying a profile and removes what was copied, even after the browser is uninstalled.
  • inkvault browsers --skip-site mybank.com never keeps that site or its subdomains, and removes what's there.

Removing rebuilds search and the dashboard and deletes the digests for each removed visit's day (in UTC) and the day either side. If it's interrupted, the next inkvault sync, inkvault index or nightly run finishes it, and search stays off until then. It can't recall an answer your AI tool already received, or a dashboard tab that's already open. The nightly backups still hold the removed visits until they rotate out (7 nights).

What's kept: each page's address and title, and when you opened it. Before anything is stored, InkVault removes parts of addresses that carry sign-in codes, tokens, signed links, password-reset tokens, and your email or username. Searches (?q=…) stay. This catches the common shapes, not every possible secret. Copying happens while the browser runs, so the newest few visits can wait for the next sync.

Safari isn't supported yet (macOS blocks reading it without Full Disk Access).

Screen capture (Windows)

With inkvault watch, you can add a local timeline of foreground windows and read text from apps you choose. Screen capture stays off until you install the watcher. It's Windows-only for now; on macOS and Linux inkvault watch says so and exits.

What it records

  • A timeline, everywhere. Every foreground window becomes a stretch: the app, a cleaned title, and when it started and ended. A window you only flick through isn't kept, and time you're away (no input for 5 minutes, or the screen is locked) isn't counted.
  • Text, in apps you choose. After you settle on a window for 30 seconds, InkVault reads its text (Windows' own OCR, on your machine) and stores it if it changed. A given window is read at most every 2 minutes.
  • No images, ever. The window image exists in memory just long enough to read, and is never written to disk.
  • Before anything is stored, secrets in titles and text (API keys, tokens, JWTs, password: ... values) are masked and URLs are cleaned. This catches the common shapes, not every possible secret.

Which apps get text. By default: Comet and Edge; Claude, ChatGPT, Perplexity and Codex; Windows Terminal, VS Code and Cursor; Notion, Obsidian and Notepad; and the Microsoft 365 apps (Word, Excel, PowerPoint, Outlook, new Outlook, OneNote). Every other app is timeline-only. Two groups are off until you say yes, and --install asks:

  • Messaging apps (Discord, WhatsApp, Telegram, Teams, LinkedIn). Reading them stores other people's messages and names, and Discord's title is the name of the person you're talking to. Off unless you answer yes.
  • Chrome. Its window title is just the page and "Google Chrome", with no profile name, so InkVault can't tell your Chrome profiles from anyone else's. Off unless you answer yes.

Without a terminal (for example a scripted install) both stay off. You can add or remove any app yourself.

Everyone using the Windows account is captured. The watcher runs in the account that installed it, from sign-in. If anyone else uses that account, what they do is recorded too. Use a separate Windows account for anyone who shouldn't be.

Never captured. Password managers and Windows' sign-in and permission prompts (1Password, Bitwarden, KeePass, KeePassXC, the lock screen, UAC) are skipped entirely: no stretch, no text. So are windows whose title contains InPrivate, Incognito or Private Browsing, and anything you add with --never-app or --never-title.

Install

uv tool install "inkvault[screen]"
inkvault watch --apps       # preview: shows the settings, records nothing
inkvault watch --install    # asks about messaging apps and Chrome, then starts at every sign-in

--apps is a preview: it shows which apps get text and which are never captured, and starts nothing. --install registers a Task Scheduler task that starts the watcher at sign-in, restarts it if it stops, and checks it's really running before it says "screen capture is on". It also adds two desktop shortcuts: Pause screen capture (1 hour) and Resume screen capture. Without the screen extra (or without an OCR language installed in Windows) the watcher still records the timeline, and inkvault status says why there's no text.

Controls

Command Does
inkvault watch --apps Show which apps get text and which are never captured. Changes nothing
inkvault watch --install Start screen capture now and at every sign-in
inkvault watch --stop Stop the running watcher (it starts again at the next sign-in)
inkvault watch --pause 30m, 1h or until-tomorrow Record nothing for a while. Works even during a nightly run
inkvault watch --resume End a pause
inkvault watch --add-app EXE / --remove-app EXE Read text in this app / back to timeline-only
inkvault watch --never-app EXE Never record this app at all
inkvault watch --never-title TEXT Skip any window whose title contains this text
inkvault watch --reset-settings Back to the default settings
inkvault watch --uninstall Stop the watcher and remove the sign-in task

Settings live in screen.json in your InkVault folder, and the watcher picks up a change within a couple of seconds. If the file is unreadable or invalid, it records nothing until it's fixed. Executable names ignore case.

Searching it

  • timeline shows screen activity live: a separate Screen section lists the windows in the range, newest first, including the one open now.
  • search_memories finds screen text and window titles after the nightly index (or inkvault index); results say how far the index reaches. Use source="screen" for just screen activity.
  • get_memory on a screen result shows the window's app, title and times, and its most recent text.
  • inkvault status shows the watcher (running, paused, the app in front, last error), the sign-in task, and how many stretches and text reads were stored.
  • The dashboard has a Screen time tile and a Screen time by app chart, and daily digests include screen time by app and the longest windows. Digests never include screen text.

Forgetting

inkvault forget --screen --app Discord.exe
inkvault forget --screen --since "2026-10-12 09:00" --until "2026-10-12 11:30"

Times are your local time: a --since date means local midnight; an --until date includes that whole day. Add Z or an offset for an exact instant. --until only goes with --since; --app removes all of an app. Whole windows are removed: any stretch that overlaps the range goes, with all its text, and the command shows the span it actually removed before it asks. Search, the dashboard and the digests are rebuilt without it. Nightly backups made before then still hold it until they rotate out (7 nights), and an answer an AI tool already received can't be recalled. Forgetting removes the past only: to stop recording an app, use --never-app.

Limits

  • Banks and other sensitive sites. Your browser-history skip_sites list holds domains, but a window title rarely contains one, so it can't be applied here. Put the text a bank's page title shows into --never-title (for example --never-title "Example Bank").
  • Private windows. The markers (InPrivate, Incognito, Private Browsing) are English. A localized browser may use other words, or none: add yours with --never-title.
  • A last moment. InkVault checks the window just before and just after it reads it, and drops the text if it changed. A window that changes in the instant between the last check and the screen being drawn can't be caught.
  • Search is nightly, timeline is live. New screen activity shows in timeline at once, and in search after the next index.
  • Store apps are timeline-only. Windows Store (UWP) apps run inside a frame window that holds no text, so they show up in the timeline but their text isn't read.
  • Windows only. macOS and Linux aren't supported.

Keep it up to date

Keep supported sessions and chosen browser history up to date, rebuild search and the Atlas, and back up your vault every night:

uvx --from git+https://github.com/sandoreclegane/inkvault inkvault schedule

This installs InkVault as a permanent inkvault command (with uv tool install, or updates an older one) and sets up a nightly run at 03:00 with your system's own scheduler: Task Scheduler on Windows, launchd on macOS, a systemd user timer (or cron) on Linux. If uv's tool folder isn't on your PATH, it tells you to run uv tool update-shell.

Each run exports new captures (if PiecesOS is running), copies new Claude Code and Codex sessions and new browser history from the profiles you chose, and saves a dated copy of vault.db in backups/ right after (the last 7 are kept). Then it rebuilds search, writes new digests (if Ollama is running) and rebuilds the dashboard. One step failing never stops the others. The computer is kept awake while it runs (Windows and macOS). The export has a time budget: if a big backlog doesn't fit, the run stops cleanly, backs up what it has, and the next night continues where it stopped.

rescue won't start while a nightly run is going; it tells you to try again. If a rescue is going when the nightly run starts, the run waits for it (up to an hour); the rescue makes its own backup when it finishes.

inkvault status shows the schedule and how the last run went. It checks the scheduler itself, and says so if the task was disabled, runs a different vault (there's one nightly run per computer user, so scheduling another vault replaces it), or points at an InkVault install that's gone, and it flags a run that's overdue (none in 26 hours). Each run is logged to nightly.log in your InkVault folder (or nightly-fallback.log next to it, if nightly.log can't be written).

The schedule is tied to your vault folder, so if you started with --home, run schedule with the same --home.

If the computer is asleep or off at run time:

  • Windows and systemd catch up when the computer is next on.
  • macOS catches up after sleep, but not after a power-off.
  • cron doesn't catch up.

The Windows task runs only while you're logged in. You can have the computer wake for the run:

  • Windows: schedule asks. Your power plan must allow wake timers, and some laptops (Modern Standby) ignore them.
  • macOS: schedule asks, then prints a one-time sudo pmset repeat ... command for you to run. It replaces any pmset repeat schedule you already have.
  • Linux: a user timer can't wake the computer. systemd runs the timer while you're logged in; loginctl enable-linger $USER keeps it going always.

inkvault schedule --at 02:30 picks another time, --wake or --no-wake skips the question, --off turns it off, and uv tool upgrade inkvault updates InkVault.

Commands

Command Does
inkvault rescue Export, index, digest (if Ollama is running), build and open the dashboard
inkvault export Copy everything out of PiecesOS. Safe to stop and re-run: it only adds what's new
inkvault sync Copy new Claude Code and Codex sessions and browser history into the vault, then rebuild search
inkvault browsers [--yes|--no KEY] [--forget] [--skip-site HOST] Choose which browser profiles are yours, and sites never to keep
inkvault index Rebuild search
inkvault digest [--model M] [--redo] Daily digests with a local model (default qwen3.5:4b)
inkvault dashboard Rebuild and open the Memory Atlas
inkvault serve Run the MCP server
inkvault status What's in your vault and where it lives, plus the schedule and last nightly run
inkvault watch ... Screen capture (Windows): preview, install, pause, stop. See Screen capture
inkvault forget --screen --app EXE / --since T --until T Remove screen capture from the vault
inkvault schedule [--at HH:MM] [--wake|--no-wake] [--off] Refresh and back up the vault every night
inkvault nightly One refresh + backup now (what the schedule runs)

Privacy

This is your screen history, your chats, your browsing and your code. InkVault stores and searches your archive locally:

  • Everything is stored in your app-data folder (%LOCALAPPDATA%\InkVault, ~/Library/Application Support/InkVault, or ~/.local/share/inkvault), or wherever INKVAULT_HOME points. Never inside the code folder.
  • No telemetry, no accounts, no cloud.
  • InkVault itself does not upload your archive. When you connect an AI client through MCP, memories returned to that client may be sent to its model provider under that client's settings. Choose your client and settings accordingly.
  • One thing is downloaded: the search model (~130 MB from Hugging Face, once). The Atlas makes no network requests; its chart library (ECharts) is bundled, so it works offline.
  • Digests use Ollama on your own machine. Skip them with --no-digest.
  • From Claude Code and Codex sessions, InkVault keeps what you typed, what the assistant replied and session titles. Claude Code's replies include its tool calls, so a file it wrote is kept as written. Tool output (files it read, command output), pasted images and attachments are left out: they are most of each file and where secrets tend to show up. That lowers the risk; it can't rule it out, since anything you typed or pasted as text is kept.
  • Browser history is read only from the profiles you choose (inkvault browsers), from a copy of the browser's file. InkVault keeps each page's address and title and when you opened it, after removing parts of addresses that carry sign-in codes, tokens, signed links, reset tokens, or your email or username. It can't promise to catch every secret. inkvault browsers --skip-site and --no … --forget remove what you don't want kept.
  • Screen capture (Windows, off until you install it) keeps window titles and, for the apps you choose, their text. Images are never saved. Secrets in titles and text are masked before they are stored. See Screen capture for what it can't catch. The connected-client boundary above applies to screen memories too.
  • Captured text and page titles were written by other people, apps and websites. The MCP server tells your AI tool to treat them as data, not instructions.

Back up your vault. It is one file: vault.db in your InkVault folder. Everything else can be rebuilt from it with inkvault index.

Rescuing from Pieces

InkVault began as a way to preserve Pieces memory. Rescue remains a supported use case; you can also start and keep a vault without Pieces.

Keep PiecesOS installed and running until your export is safely complete:

uvx --from git+https://github.com/sandoreclegane/inkvault inkvault rescue

The export preserves the raw records PiecesOS returns: captures, summaries and their text, chats, snippets, tags, websites, and people.

It takes a while. PiecesOS hands records over at about 8 per second, so a year of captures (~100,000) takes around 3-4 hours. Leave it running, or press Ctrl+C anytime: InkVault keeps everything saved so far and opens a dashboard of what you have. Run the same command again later and it picks up where it left off.

Good to know

  • Your projects on the dashboard are detected from recurring phrases in your session titles. To choose your own, create themes.txt in your InkVault folder with lines like Website = website|landing page|stripe and run inkvault dashboard.
  • Topics come from the topic tags Pieces wrote on each session summary. Ongoing topics recur across months; bursts are concentrated in a few weeks. They appear after the next inkvault index (part of rescue and the nightly run). Thanks to Anthony at Pieces for the idea.
  • Claude Code and Codex sessions are read from ~/.claude/projects and ~/.codex/sessions (or CLAUDE_CONFIG_DIR and CODEX_HOME if you set them). rescue and the nightly run do this too; inkvault sync does it on its own, and works without Pieces. Only what's new since the last sync is read.
  • Claude desktop app sessions (agent mode, Windows) are read from the app's own folder (%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\local-agent-mode-sessions) and named Claude desktop · project: title. On macOS and Linux they aren't read yet.
  • PiecesOS port: InkVault reads the port PiecesOS saved in its own config (.port.txt), then the port that worked last time, then tries 39300 and 1000. To force a port, set INKVAULT_PIECES_PORTS or pass --pieces-ports (for the nightly run: inkvault --pieces-ports 39301 schedule).
  • Pieces' own export tool: Pieces said they'd send one. Use it too; two copies are better than one. Support for importing its format into InkVault is planned.
  • Tested on Windows with PiecesOS 12.6.2 and a vault of 120,000 captures. macOS and Linux should work; reports are welcome. inkvault schedule has been tested end to end on Windows; on macOS and Linux it is covered by automated tests only so far, so a report from a real Mac or Linux machine would help a lot.

Not affiliated with Pieces

InkVault is an independent project. "Pieces" is a trademark of its owner.

MIT licensed. Made by T. Matthew Chase / Logos 7.

Metadata

Release files for inkvault 0.3.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for inkvault 0.3.4
File Size Uploaded
inkvault-0.3.4.tar.gz 699.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for inkvault 0.3.4
File Interpreter ABI Platform
inkvault-0.3.4-py3-none-any.whl Python 3 none any Details

Total release size: 1.3 MB

Release files / inkvault-0.3.4.tar.gz

Download URL inkvault-0.3.4.tar.gz
Size 699.8 kB
Tags Source
SHA-256 checksum
How to use checksums
07c79864b53771bea576a0e22938b31e4956d2cab75deaeb27477ca988567e92
BLAKE2b-256 checksum
How to use checksums
20b485bf5039b0b8460da15c3b9c6f6297ad57f28e7ac9dda8b5c369387d1195
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / inkvault-0.3.4-py3-none-any.whl

Download URL inkvault-0.3.4-py3-none-any.whl
Size 597.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e18dfd1553a124b765c76d78aa992fe31e33d8531ec29803a747a72148a998f8
BLAKE2b-256 checksum
How to use checksums
1e33a63a559e0d5472c0743f435a481167ac20a505ae9763d320e3e487ac8608
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.3.4 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page