TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
A self-hosted file manager for the memory folders, prompts and private files of your AI tools. Encrypted, versioned and backed up on your own drives. Runs fully offline.
ProductivityTypeScript · ShellGitHub @JoshWAMiascoOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
CMM — Context Memory Manager: a self-hosted, offline file manager for the memory folders and prompts of AI tools like Claude Code, Gemini CLI and Codex. Encrypted, versioned, backed up to your own drives.
Taken from the repository README
Loading the full README.
Read the full README ↗AI agents and chat tools keep their memory in plain folders: personas, project knowledge, scratchpads, notes, datasets. CMM gives those folders a proper home. Browse and edit them in one app, mark folders as memories, run any agent CLI (Claude Code, Gemini CLI, Codex…) right inside them and keep it working as a background job, lock or encrypt the sensitive ones, keep a history of every change, and back everything up to a USB stick or external drive, ready to clone onto another computer. Nothing leaves your machine: there is no account, no cloud and no telemetry.
CMM runs two ways:
A file tree and a file pane, side by side. Markdown opens formatted and edits in a rich editor or as source; code opens with syntax colours in a code editor; images, PDFs and CSV/TSV tables have their own viewers. Excel and Word files open in the browser, and PowerPoint, older Office, OpenDocument and RTF files are shown as PDFs when LibreOffice is installed; videos show a still frame with their length. Drag and drop, copy and paste across drives, upload files or whole folders, replace a file and see what changed, download as zip, and a trash you can restore from. Light, dark or system theme, per user. Hide the tree (⌘/Ctrl+\) to give the editor the whole window.
| Markdown editor | Code editor |
|---|---|
| CSV and TSV tables | Images |
Press ⌘/Ctrl+K to switch drives, jump to a page, or find any file or folder by name.
Turn any folder into a memory with a name, a colour and a description, or start one from a template (LLM persona, project knowledge, agent scratchpad). Each memory gets an overview with its size, recent files and quick actions, a card of its own on the Drives page (memories on plugged-in drives too, so a drive from another computer shows what it holds), and its own view whose file tree starts at the memory. Folders can be made view-only or locked, so an agent or a slip of the mouse can't change them.
| Memory overview | Protection |
|---|---|
Encrypt a folder with AES-256-GCM. Its key lives in a key file that you keep, for example on a USB stick. Files stay encrypted on disk and in every backup; unlock the folder with its key file to read and edit them inside CMM, and it locks again on its own.
| Encryption wizard | Unlocking a folder |
|---|---|
Turn on versioning for a folder and CMM keeps a Git history of it: every save is a version you can compare and restore, with undo and redo, named snapshots, and nothing to learn about Git.
Back up any folder to another drive: copy, mirror, or dated snapshots. Select folders and memories in the tree (or open a folder's settings) to back them up into a new memory on a drive, with their names, icons, encryption and history; plug that drive into another computer with CMM and copy them onto it the same way. Profiles can run as soon as a drive is plugged in, interrupted backups resume where they stopped, and a live picture shows your computer, its drives and every running transfer.
| Backup topology | A running transfer |
|---|---|
Run any agent CLI you like, right inside a memory: Claude Code, Gemini CLI, Codex, opencode, Aider, or your own scripts and Git. Open a terminal on a folder or memory and it starts there, with your own shell, PATH and tools, so the agent reads and writes that memory directly. Terminals dock along the bottom of the window like chat windows: keep several open at once (one per agent or memory), minimize them (a dot shows new output), resize them, and pick up where you left off after a reload. Admins only; on a server they stay off until an admin turns them on.
Leave an agent working while you're away. Run as a job on a terminal's title bar turns it into a job: it keeps
running in the background, like a tmux session, after CMM is closed, restarted, updated or even crashes. The Jobs
page shows a card for each one, with when it started, how long it has run and in which folder, and the dashboard and
navigation show them too. Open a job to see its terminal across the whole window, then open it in the editor, turn it
back into an ordinary terminal, or discard it, which ends it and leaves no trace.
Open a CMM server from your phone's browser. Phones get a bottom bar and a menu drawer, and the explorer shows the files, the open file or the terminal one at a time. Terminals work with the on-screen keyboard (autocorrect and all), scroll with a swipe, and have a key bar with Esc, Tab, Ctrl, ^C, arrows and Enter, enough to drive Claude Code from a phone.
Admin, editor and viewer accounts with per-storage access, sign-in lockout, auto-lock, a password check before sensitive actions, and HTTPS on the server. Drives (internal folders, external disks and USB sticks) appear and disappear live, and can be ejected from CMM. A drive the computer can only read (such as an NTFS drive on a Mac) is shown as read-only, with the reason, instead of failing when you write to it. The version shows on the sign-in page and the Drives page.
| Users | Security |
|---|---|
Two illustrated guides cover installing and using CMM, written for non-technical users:
npm run docs:pdf builds both as PDFs (dist/docs/); the desktop app and the server package include them.
Requires Node.js 22 (see .nvmrc).
npm install
npx playwright install chromium # once: used to build the PDF guides and the app icons
npm run dev # http://127.0.0.1:7420, data in .cmm-dev-data/
The first visit opens the setup wizard. In this (server) mode it asks for a one-time setup code, which the terminal
prints ([cmm] first-run setup code: …) and .cmm-dev-data/setup-code holds. To browse a folder, list it in
.cmm-dev-data/config.json and restart:
{ "storageRoots": [{ "path": "/absolute/path/to/a/folder", "label": "My files" }] }
Plugged-in USB drives show up on their own.
Optional settings go in a .env file, which is never committed: copy .env.example and uncomment what you need
(CMM_MODE, CMM_DATA_DIR, CMM_CONFIG, HOSTNAME, PORT, NEXT_TELEMETRY_DISABLED). The npm scripts above set
the mode and data folder themselves.
npm run build # the server in dist/app, the desktop main process in dist/electron, the PDF guides in dist/docs
npm start # runs dist/app/entry.js
npm run install:desktop # build, sign, quit CMM, install in /Applications, open it
npm run install:desktop -- --rollback # go back to the version installed before
It refuses while CMM is running a backup or another job (--force to quit anyway), keeps the previous version for
--rollback, and leaves CMM's data alone (each version migrates it on start). --skip-build installs the last build.
Put a code signing identity from your keychain (security find-identity -v -p codesigning) in .cmm-local.json, which
is not committed:
{ "signingIdentity": "Apple Development: Your Name (TEAMID)" }
With it, macOS keeps CMM's access to Documents, Desktop and Downloads across updates. Without it the app is ad-hoc signed, a new identity for macOS each build, and it asks for those permissions again after every update.
npm run build:desktop # dmg on macOS, nsis on Windows, AppImage + deb on Linux, in dist/desktop/
Build each installer on its own operating system and architecture: the native modules (better-sqlite3,
@node-rs/argon2) are installed for the machine that runs npm install. Options after --: --dir (unpacked app
only), --skip-build, --arch x64, --targets AppImage. Without a signing certificate the apps are unsigned (ad-hoc
on macOS).
The Desktop installers workflow (.github/workflows/desktop-installers.yml) builds the Windows and Linux (x64)
installers on GitHub's runners of each platform, so they can be made from a Mac:
gh workflow run desktop-installers.yml -f tag=v1.1.0 -f platform=all -f attach=true builds a tag and attaches them to
its release.
npm run package:server -- --arch x64 # or arm64
Build it on Linux with C++ build tools installed (sudo apt install build-essential python3): npm install compiles
the terminal module there. This makes an offline tarball with its own Node.js runtime and install.sh, which sets CMM
up as a hardened systemd service with the cmm admin command. The Server Guide walks
through the install.
Each release has the x64 package ready to download, with cmm-server-setup.sh
(deploy/linux/cmm-server-setup.sh): one script that installs it behind nginx on a
Tailscale network, with a real HTTPS certificate (sudo ./cmm-server-setup.sh --package ./cmm-server-<version>-linux-x64.tar.gz).
scripts/update-installer.sh copies the package for the version in package.json and that script into an installer
folder (~/cmm-installer, or --dir) and removes older packages; --build builds the package first.
| Command | What it does |
|---|---|
npm run lint / npm run typecheck / npm test | ESLint, TypeScript and the Vitest suite (tests/) |
npm run build:web then npm run test:e2e | Builds only the web server, then runs the Playwright end-to-end suite (e2e/) against it on throwaway servers and data in .cmm-test-data/; the desktop app is not started or installed |
npm run check:offline | Builds and fails if the output contains a fetchable external URL |
npm run docs:pdf | Builds the PDF guides from docs/guides/ |
npm run icons:app | Regenerates the desktop app icons from public/icons/cmm/logo.svg |
npm run db:generate | Creates a database migration after a schema change |
Next.js 16 and React 19, TanStack Query, Tailwind CSS 4, SQLite with Drizzle, Tiptap and CodeMirror, pdf.js, xterm.js and node-pty, simple-git, Electron 45 and electron-builder. Fonts: Oxanium, Martian Mono and Inter (SIL Open Font License). Every dependency's license is listed in the app under Settings › About.
Contributions are welcome: bug reports, fixes, features and better docs. Read CONTRIBUTING.md for setting up, how the code is organised and what a pull request needs, then pick an open issue or open one to discuss your idea. Please report security problems privately through Report a vulnerability.
MIT © 2026 Joshua Miasco