Skip to content

4.8.0 - memories that expire, and the whole setup from the app

Choose a tag to compare

@MaxFreedomPollard MaxFreedomPollard released this 20 Aug 17:10
· 50 commits to main since this release

Memories can now carry an expiry date, and the whole of setup happens in the app.

Memories that expire

Some facts expire. A sale that ends on the 30th. A conference rate held until registration closes. A parking permit good through the end of term, a code that changes when the contractor leaves, a rota covering one month. Stored as ordinary memories they get quoted back months later as though nothing had changed.

Most of these memories are not worth storing as history, and adding an expiry date allows for clutter clearing without relying upon a future curator. By getting it right the first time, we prevent a lot of headaches in the future. Trivial facts which have a date upon which they become untrue can now be created with an expiry date. We have added a "Forget memories when they expire" toggle to our minimal app, so users who would rather nothing were removed can still use Compartment as per usual.

memory_store now takes expires, and so does compartment store --expires. Say the last day it is true in as few characters as it can be said: 2w, 10d, 3m, 1y, or the day itself, 2026-09-30. The last day counts, so a sale running for the next two weeks is 2w. Months and years are calendar ones, so 3m from the 20th is the 20th. Leave it off and the memory is permanent, which is what almost every memory is and what every memory stored before this release is.

The expiry is written into the memory's own text beside its source and discovery date, as [from chat, 2026-08-20, until 2026-09-30], so the claim carries its shelf life wherever it ends up: exported, pasted into a document, read years later by something that never saw the schema. It stays out of the embedding, so two memories that happen to end on the same day do not look alike to the encoder.

Forget memories when they expire is one new switch in the panel, on by default. On, a memory whose last day has gone is removed: swept when the vault is opened and once an hour while it stays open, cleared through the same path every other removal uses so the index, the full-text rows and the audit chain stay consistent, and written into the audit log with the ids. Off, nothing is ever deleted and the date is only a label: still recorded, still shown, still searchable. compartment expire sweeps on demand, --list shows what is going and when, and --enable / --disable reach the same switch from a machine with no panel.

Nothing that was not given a last day is ever touched. A date it cannot read is refused when the memory is stored rather than guessed at, and so is one that has already gone. Starting memories and pack content can never carry one.

The app

The panel does the whole of setup now: create the vault, open it, connect your agent, all without a terminal.

Connect reports what the agent's own config says

compartment integrate claude wires Claude Code and Claude Desktop, which are separate programs with separate configuration files. A run that registers Claude Desktop perfectly still mentions on the way past that the Claude Code CLI is not on PATH, and the panel was reading its verdict out of that prose. So a Mac with Claude Desktop and no Claude Code CLI got "Could not find Claude on this machine" for a Claude that was installed, running, and by then connected.

The command written into an agent's config is one the agent can run

integrate used to fall back to the bare name compartment when it could not find one on PATH. A GUI client launched from the Dock does not inherit a shell PATH, and an install that is only Compartment.app never put compartment on one to inherit, so that entry named nothing on the machine it was written to. It now resolves to an absolute path that exists, which inside Compartment.app is the copy sealed in the bundle.

Downloads

Artifact For
Compartment-4.8.0.pkg macOS, one click, with the optional menu bar utility
Compartment-4.8.0.dmg macOS, drag to Applications
compartment-4.8.0-py3-none-any.whl pip / offline installs, any OS
compartment-4.8.0.tar.gz source distribution, packagers, air-gapped builds

Or, for the CLI and MCP server without the app:

pip install compartment